1

我有以下查询。但目前我正在努力让它返回没有聚合的行和其中的数据。

我认为它可以与聚合和分组子句一起使用,所以如果有人能解释为什么那会很棒!

SELECT a.id, a.name, a.slug, COUNT(i.area_id) as numItems
FROM `area` `a`
LEFT JOIN `item` `i` ON a.id=i.area_id
WHERE i.date_expired > CURDATE() AND i.live = 1
GROUP BY `a`.`name`
ORDER BY `a`.`name`

谢谢

4

3 回答 3

1

这是因为您在您的WHERE条件中引用了项目表,而该表不设置OUTER JOIN. 将其移至JOIN

SELECT a.id, a.name, a.slug, COUNT(i.area_id) as numItems
FROM `area` `a`
LEFT JOIN `item` `i` ON a.id=i.area_id
    AND i.date_expired > CURDATE() AND i.live = 1
GROUP BY `a`.`name`
ORDER BY `a`.`name`
于 2013-06-26T03:05:05.113 回答
1

你应该过滤ON子句,因为你正在做LEFT JOIN. 例如。

SELECT a.id, a.name, a.slug, COUNT(i.area_id) as numItems
FROM   area a
       LEFT JOIN item i 
          ON a.id = i.area_id AND
             i.date_expired > CURDATE() AND 
             i.live = 1
GROUP BY a.name
ORDER BY a.name

ON在子句上过滤和在子句上WHERE过滤的区别在于,ON子句在连接表之前先WHERE过滤记录,而子句从连接表的结果中过滤记录。

于 2013-06-26T03:05:40.840 回答
1

问题是该where子句撤消了left join. 当没有匹配项时,所有字段的值都i可能出现 - 这些被过滤掉,因为比较永远不会为真。NULL

您可以通过将比较移动到on子句来轻松解决此问题:

SELECT a.id, a.name, a.slug, COUNT(i.area_id) as numItems
FROM `area` `a`
LEFT JOIN `item` `i` ON a.id=i.area_id and
                        i.date_expired > CURDATE() AND i.live = 1
GROUP BY `a`.`name`
ORDER BY `a`.`name`
于 2013-06-26T03:05:56.627 回答