基于计数条件选择记录的SQL查询

6
标题可能不太清晰-不确定如何用一行来解释问题。我有3个表:TOPIC、VIDEO和TOPIC_VIDEO。一个主题可以有一个或两个视频,这些视频可以是示例视频或非示例视频。以下是相关列名的表格中的示例数据。现在,对于给定课程,我们需要选择所有主题及其相应的视频。如果一个主题有多个视频, 我们想要选择 IS_SAMPLE 为“N”的视频。请问是否可以做到,如何实现?感谢您的时间。
以下是您迄今为止的查询:
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
若数量为2,则需要选择 is_sample='N' 的记录。

一个查询中有多个 SELECT 语句是可以接受的吗? - Evan Mulawski
这会导致相当大的性能损失吗? - Gublooo
1个回答

5
这个问题的解决方式之一是:
  • 加入一个内联视图,通过主题计算数量。
  • 使用计数创建一个case语句,只连接到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 

演示

输出

| 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 |

谢谢Conrad - 我不知道该怎么做 - 但是你的解释和演示现在使它看起来简单了:) - 非常感谢 - Gublooo
2
@Gublooo 不用谢。顺便说一下,你的表格格式让使用 SQLFiddle 的“文本转 DDL”功能变得轻而易举。感谢你的帮助。 - Conrad Frix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接