好的,所以我需要做一些具体的查询。
我有一个表“描述”,我需要找到是否有链接到该描述的图片,为此,我做了一个左连接,用表“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,而且已经实现了。
答案 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