2014-11-03 89 views
0

好的,我有一些具体的查询我需要做。SQL,左连接,分组计数(*)为haspicture?

我有一个表“描述”,我需要找到是否有一张图片链接到描述,为此,我做了一个左连接,与表“文件”。

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包含它应该包含的内容,找到的文件数。 如果至少有一个附加文件,我只想将haspicture设置为1。

我需要它在1,因为然后我有方法排序不同级别的优先级的结果。当然,我缩短了真正的查询,我选择了超过D.id,并且在现实中拥有图片。

+0

我说,因为反引号的mysql的标签。 – 2014-11-03 17:05:01

回答

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)的索引。

+0

好极了,两种解决方案都可以工作,但我并不知道或想到第二个,非常感谢! – 2014-11-03 17:23:35

0

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

0

使用计数,但指定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