SQL,左连接,分组依据,计数(*)为haspicture?

时间:2014-11-03 16:56:59

标签: mysql sql count group-by left-join

好的,所以我需要做一些具体的查询。

我有一个表“描述”,我需要找到是否有链接到该描述的图片,为此,我做了一个左连接,用表“files”。

SELECT D.id, COUNT(*) as haspicture
FROM `description`as D 
LEFT JOIN `files` as F ON D.id=F.id  
GROUP BY D.id

它运行良好,但列haspicture包含它应包含的内容,找到的文件数。 如果附加了至少1个文件,我只想将haspicture设置为1.

我需要它在1,因为那时我有办法用不同的优先级排序结果。当然,我缩短了真正的查询,我选择的不仅仅是D.id,而且已经实现了。

3 个答案:

答案 0 :(得分:2)

您可以使用case语句。另外,因为小心你在想什么:

SELECT D.id,
       (CASE WHEN COUNT(f.id) > 0 THEN 1 ELSE 0 END) as haspicture
FROM `description`D LEFT JOIN
     `files` F
      ON D.id = F.id  
GROUP BY D.id;

您可能会发现以下内容效果更好,因为没有更大的group by

select d.id,
       (exists (select 1 from files where d.id = f.id)) as haspicture
from description d;

需要files(id)的索引才能获得最佳效果。

答案 1 :(得分:0)

SELECT IF(COUNT('*') > 0, 1, 0)) as haspicture

答案 2 :(得分:0)

使用count,但是指定f.id(如果你只做COUNT(*)那么它总是至少为1,因为它将计算没有文件作为一行的描述): -

SELECT D.id, if(COUNT(f.id) = 0, 0, 1) AS haspicture
FROM `description`as D 
LEFT JOIN `files` as F ON D.id=F.id  
GROUP BY D.id

或使用相关的子查询(不热衷于这些): -

SELECT D.id, IF((SELECT COUNT(*) FROM files WHERE files.ID = D.id) > 0, 1, 0) AS haspicture
FROM `description`as D