2012-08-02 76 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