2012-06-14 41 views
6

Tiêu đề có thể không rõ ràng - không chắc chắn cách giải thích vấn đề trong một dòng.Truy vấn SQL - Chọn bản ghi dựa trên điều kiện đếm

Tôi có 3 bảng

 
TOPIC 
VIDEO 
TOPIC_VIDEO 

Một chủ đề có thể có một hoặc hai video. Video có thể là video mẫu hay không.

dữ liệu mẫu trong bảng với tên cột có liên quan

TOPIC

 
TOPIC_ID |   NAME   | COURSE_ID 
    1 | Excel - Add/Subtract |  1 
    2 | Excel - sort   |  1 
    3 | Excel - filter  |  1 
    4 | Excel - formulas  |  1 


VIDEO 

VIDEO_ID | VIDEO_URL 
    10 | www.youtube.com?v=123 
    12 | www.youtube.com?v=345 
    13 | www.youtube.com?v=567 
    14 | www.youtube.com?v=879 
    15 | www.youtube.com?v=443 


TOPIC_VIDEO 

TOPIC_VIDEO_ID | TOPIC_ID | VIDEO_ID | IS_SAMPLE  
     1  | 1 | 10 | Y 
     2  | 2 | 12 | N 
     3  | 3 | 13 | N 
     4  | 3 | 14 | Y 
     5  | 4 | 15 | N 

Vì vậy, những gì tôi đang cố gắng làm là cho một khóa học được chọn tất cả các chủ đề và video tương ứng của họ. Bây giờ nếu chủ đề có nhiều video - tôi muốn chọn video có is_sample là "N".

Giống như trong ví dụ trên - topic_id 3 có hai video với video_id 13 và 14 - vì vậy video_id 13 phải được chọn.

Đây là câu hỏi tôi có cho đến nay

 
select topic.*,count(topic.topic_id),video.video_id,topic_video.is_sample 
from topic 
left join topic_video ON topic_video.topic_id = topic.topic_id 
left join video ON video.video_id = topic_video.video_id 
where course_id=1 
group by topic.topic_id 

Vì vậy, bây giờ nếu số lượng là 2 - Tôi muốn chọn kỷ lục với is_sample = 'N' Đây có phải là có thể và làm thế nào tôi có thể thực hiện điều này. Cảm ơn rất nhiều đã dành thời gian

+0

Are nhiều 'SELECT' báo cáo trong một truy vấn chấp nhận được? –

+0

sẽ cho kết quả đạt được hiệu suất đáng kể – Gublooo

Trả lời

5

Một cách để giải quyết này là để

  • Tham gia vào một cái nhìn inline cho phép tính đếm theo chủ đề.
  • Sử dụng đếm để tạo ra một tuyên bố trường hợp đó chỉ tham gia để IS_SAMPLE = N


SELECT * 
FROM topic 
     LEFT JOIN (SELECT topic_id, 
         Count(topic_id) t_count 
        FROM TOPIC_VIDEO 
        GROUP BY topic_id) t 
       ON topic.topic_id = t.topic_id 
     LEFT JOIN topic_video 
       ON topic_video.topic_id = topic.topic_id 
       AND TOPIC_VIDEO.IS_SAMPLE = CASE 
               WHEN t.t_count = 2 THEN 'N' 
               ELSE TOPIC_VIDEO.IS_SAMPLE 
              END 
     LEFT JOIN video 
       ON video.video_id = topic_video.video_id 

DEMO

Output

| TOPIC_ID |     NAME | COURSE_ID | T_COUNT | TOPIC_VIDEO_ID | VIDEO_ID | IS_SAMPLE |    VIDEO_URL | 
------------------------------------------------------------------------------------------------------------------------- 
|  1 | Excel - Add/Subtract |   1 |  1 |    1 |  10 |   Y | www.youtube.com?v=123 | 
|  2 |   Excel - sort |   1 |  1 |    2 |  12 |   N | www.youtube.com?v=345 | 
|  3 |  Excel - filter |   1 |  2 |    3 |  13 |   N | www.youtube.com?v=567 | 
|  4 |  Excel - formulas |   1 |  1 |    5 |  15 |   N | www.youtube.com?v=443 | 
+0

Cảm ơn Conrad - không biết phải làm thế nào - nhưng lời giải thích và bản demo của bạn khiến nó trông đơn giản bây giờ :) - cảm ơn một bó – Gublooo

+2

@Gublooo niềm vui của tôi. BTW định dạng bảng của bạn làm cho nó dễ dàng sử dụng tính năng 'Text To DDL' của SQLFiddle. Cảm ơn vì điều đó. –

Các vấn đề liên quan