我一直在试图弄清楚这个问题:
我有两张桌子:
Labels
id name
====================
1 Inbox
2 Sent
3 Trash
Messages
id label_id user_id name status
===============================================================
1 1 1 My First Message 1
2 1 1 My Second Message 1
3 2 1 My Third Message 1
4 0 1 My Fourth Message 1
5 0 1 My Fifth Message 1
这是我的疑问:
SELECT
m.name,
m.id,
m.label_id,
l.name AS labelname
FROM
`Messages` m
LEFT JOIN `Labels` l
ON l.id = m.label_id
WHERE m.user_id = 1
AND m.status = 1;
无论匹配消息label_id
,所需的结果都是显示所有标签类似的东西:
Inbox
=================
My First Message
My Second Message
==================
Sent
=================
My Third Message
=================
Trash
=================
=================
My Fourth Message
My Fifth Message
=================
正如您所看到的,最后两条消息没有任何label_id,但我仍然希望在末尾显示它们以及当前没有分配任何内容的垃圾标签。
答案 0 :(得分:1)
您的查询:
(
SELECT m.name, m.id, m.label_id, l.name AS labelname
FROM `Messages` m
LEFT JOIN `Labels` l
ON l.id = m.label_id
WHERE m.user_id = 1
AND m.status = 1
)
UNION
(
SELECT m.name, m.id, m.label_id, l.name AS labelname
FROM `Labels` l
LEFT JOIN `Messages` m
ON l.id = m.label_id AND m.user_id = 1 AND m.status =1
)
的 sqlFiddle demo 强>
使用UNION
将原始结果与倒置 LEFT JOIN
的结果合并。
请注意不同的ON
条件:在第二个WHERE
中使用SELECT
导致虚假结果。