Sql 在左连接和何处计数
我有一个小问题,左连接,我想要一个列表的设计和每个设计,我想显示有多少评论每个设计 我正在使用左连接Sql 在左连接和何处计数,sql,select,group-by,left-join,Sql,Select,Group By,Left Join,我有一个小问题,左连接,我想要一个列表的设计和每个设计,我想显示有多少评论每个设计 我正在使用左连接 SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds LEFT JOIN tdic_comments com ON (com.design_id = ds.id) WHERE ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1 GROUP BY ds.id
SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds
LEFT JOIN tdic_comments com ON (com.design_id = ds.id)
WHERE ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1
GROUP BY ds.id
ORDER BY ds.date_added ASC
但这不起作用,因为它只显示一个有1条注释的设计,但我在表中有两个设计,第二个设计没有注释
如果我将SQL更改为
SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds
LEFT JOIN tdic_comments com ON (com.design_id = ds.id)
GROUP BY ds.id, com.approved, ds.approved
ORDER BY ds.date_added ASC
这就是删除WHERE子句。但这是不好的,因为它会选择未经批准的设计和评论
我错过了什么/做错了什么?将注释上的所有过滤器移动到
on
子句中:
SELECT ds.*, COUNT(com.design_id) AS countcom
FROM tdic_designs ds
LEFT JOIN
tdic_comments com
ON com.design_id = ds.id
AND com.approved = 1
WHERE ds.approved = 1
AND ds.hidden = 0
GROUP BY
ds.id
ORDER BY
ds.date_added ASC
使用
WHERE
子句时,这些限制将应用于left join
s提供的行。因此,如果某些行不符合限制条件,则会删除它们
您需要做的是将这些限制放在ON
子句中,它应该起作用,因此如果不起作用,它将显示NULL
,而不是删除该行
大概是这样的:
SELECT ds.id, count(com.comment) AS countcom
FROM tdic_designs ds
LEFT JOIN tdic_comments com ON (com.design_id = ds.id) AND ds.approved = 1 AND ds.hidden = 0 AND com.approved = 1
GROUP BY ds.id
ORDER BY ds.date_added ASC
另一个问题是在
groupby
上只有ds.id
时,在SELECT
中使用ds.*
,问题是在WHERE子句中包含com.approved=1
时,它过滤掉com.approved
为NULL
的所有行,即在外部表中未找到匹配项的所有行
正如其他人所建议的,您可以通过将该条件移动到ON
子句来解决这个问题,但我并不喜欢这样,因为它不是连接条件
我会将外部表上的过滤器移动到内联视图中
SELECT ds.*, count(com.comment) AS countcom FROM tdic_designs ds
LEFT JOIN (SELECT * FROM tdic_comments com WHERE com.approved = 1) com
ON (com.design_id = ds.id)
WHERE ds.approved = 1 AND ds.hidden = 0
GROUP BY ds.id
ORDER BY ds.date_added ASC
@莫滕哈格没问题,如果有效,别忘了接受答案:)@aF.why?如果您的意思是出于与Quassnoi所述相同的原因,那么您可能是对的,但问题没有指定MySQL。在Oracle中,我不希望出现任何性能问题。