Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在左连接和何处计数_Sql_Select_Group By_Left Join - Fatal编程技术网

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中,我不希望出现任何性能问题。