如何在此查询中正确使用LEFT JOIN IS NULL或NOT EXISTS?

时间:2012-08-02 16:51:36

标签: sql database join left-join

经过几十次尝试后,我仍然得到了错误的结果,所以我想我最好寻求帮助。

表:

labels
    id, user_id, name

messages_labels
    id, message_id, label_id

labels.id指的是message_labels.label_id

如果给出message-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 个答案:

答案 0 :(得分:2)

这应该工作:label_id上的LEFT JOIN和消息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

答案 1 :(得分: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)

如果我正确地读了你的问题。