2012-08-02 26 views
1

經過幾十次嘗試後,我仍然得到錯誤的結果,所以我想我最好尋求幫助。如何在此查詢中正確使用LEFT JOIN爲NULL或NOT EXISTS?

表:

labels 
    id, user_id, name 

messages_labels 
    id, message_id, label_id 

labels.idmessage_labels.label_id

如何在給定一個消息ID和user_ID的正確結果未使用的標籤?對於未使用的標籤,我指的是對於給定的消息ID,在message_labels中沒有條目的標籤,基本上只有選擇標籤才能添加到消息中,但尚未用於此消息。

這意味着像...

SELECT l.id, l.name 
FROM labels l 
INNER/LEFT JOIN messages_labels ml ON (l.id=ml.label_id) 
WHERE... user_id=:user_id ... 

... and `message_id <> :message_id` 

回答

2

這應該工作:LEFT JOIN在label_id和消息ID,什麼都沒有ML記錄你想要什麼

SELECT 
    l.id, l.name 
FROM labels l 
LEFT JOIN message_labels ml 
    ON l.id = ml.label_id 
    AND message_id = :message_id 
WHERE l.user_id = :user_id 
AND ml.id IS NULL 
+0

謝謝你msmucker0527!優秀! :) – Helmut 2012-08-02 17:04:22

1

一種方法:

SELECT labels.*, count(messages_labels.id) AS mlid 
FROM labels 
JOIN messages_labels ON labels.id = messages_labels.label_id 
WHERE (user_id = :user_id) AND (message_id = :message_id) 
GROUP BY labels.id 
HAVING (mlid = 0) 

如果我正確的看書你的問題。

+0

這是不是返回0結果每一次? – msmucker0527 2012-08-02 17:03:38

+0

它會返回沒有關聯消息的標籤。 – 2012-08-02 17:10:22

+0

不會被那些where子句中的message_id消除嗎? – msmucker0527 2012-08-02 17:11:05