Php,MySql加入两个表并显示有和没有关系的所有记录

时间:2016-03-12 01:24:16

标签: php mysql

我一直在试图弄清楚这个问题:

我有两张桌子:

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,但我仍然希望在末尾显示它们以及当前没有分配任何内容的垃圾标签。

1 个答案:

答案 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导致虚假结果。