2014-11-03 62 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