mysql LEFT JOIN问题

时间:2013-12-04 22:50:42

标签: mysql sql database

订阅和屏幕有两个表。屏幕订阅不止一个。我正在使用此查询来获取所有订阅数量的屏幕。

SELECT sc.id, sc.alias, sc.ad_capacity, COUNT(s.id) as ad_count FROM screen sc LEFT JOIN
subscription s ON sc.id = s.screen_id Group BY (s.screen_id);

但是,我只获得与订阅相关的屏幕。我认为LEFT JOIN应该可以解决我的问题。但是,事实并非如此。

感谢。

2 个答案:

答案 0 :(得分:2)

您需要按sc.id分组,因为s.screen_id对于没有订阅的所有屏幕都是相同的(NULL),因此所有这些屏幕当前都被分组到一个结果行中

答案 1 :(得分:0)

更详细地说,与MSSQL等其他数据库不同,MySQL允许在没有选择的每个项目的情况下进行分组,而不是聚合函数(sum,min,max等)或group by子句的一部分。这不是有效的SQL,可能会引起很多麻烦,比如你现在的那个。

在您的示例中,如果订阅表中有多个行具有相同的screen_id(可能因为这就是为什么您将拥有外键,以表示一对多关系),那么它将从它找到的第一行中获取具有该id的订阅表,并从该行中选择剩余的项目(别名,容量等),而不是为您提供所有存在的值。它首先找到的行并不总是确定的。

简而言之,在一些聚合函数或group by子句中包含您选择的所有内容,以避免这些麻烦。