繁体   English   中英

PHP,MySQL连接两个表并显示具有和不具有关系的所有记录

[英]Php, MySql Join two tables and show all records with and without relationship

我一直在努力寻找这个查询:

我有两个表:

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,但是我仍然想在末尾显示它们以及“垃圾箱”标签,该标签目前未分配任何内容。

您的查询:

(
         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演示

使用UNION将原始结果与反向 LEFT JOIN结果合并。

请注意不同的ON条件:在第二个SELECT使用WHERE会导致假结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM