Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有多个左联接的查询,未获得所需结果_Mysql_Sql_Left Join - Fatal编程技术网

Mysql 具有多个左联接的查询,未获得所需结果

Mysql 具有多个左联接的查询,未获得所需结果,mysql,sql,left-join,Mysql,Sql,Left Join,这里有一个 有人能告诉我如何使用左连接获得此输出吗 notification_recipient pm_sender msg modification_page_id Peter Tom Hello NULL notification_recipient pm_sender msg modification_page_id Peter NULL

这里有一个

有人能告诉我如何使用
左连接
获得此输出吗

 notification_recipient  pm_sender    msg     modification_page_id 
 Peter                   Tom          Hello   NULL
 notification_recipient  pm_sender    msg     modification_page_id 
 Peter                   NULL         NULL    2
以下是我尝试过的查询:

   SELECT u.name AS notification_recipient,us.name AS pm_sender,
          p.msg,um.page_id AS modification_page_id 
    FROM notification n 
    LEFT JOIN pm p ON p.pm_id = n.pm_id
    LEFT JOIN users u ON u.user_id = p.recipent_id
    LEFT JOIN users us ON us.user_id = p.sender_id
    LEFT JOIN user_modification um ON um.modification_id = n.modification_id
    WHERE u.name = 'Peter'
    AND n.is_read = '0'  
我在寻找某种排序条件联接,这意味着根据字段中是否存在值来联接不同的表,但在我的示例中找不到适用的联接。任何其他有效的解决方案也将不胜感激

背景:

我计划制作一个通知系统,向用户发送不同类型的消息(用户之间的私人消息、他们对条目的修改已被批准的消息等)。 当一个用户登录时,我想做一个查询,看看是否有该用户的未读通知。如果是,将通过Ajax向他发送通知

举例来说,假设Tom向Peter发送了一条私人消息,并且他对条目的修改得到批准,则将调用表
pm
user\u modification
中的两个触发器,将两个新行添加到
通知中。列
pm\u id
pm
引用,
modification\u id
modification
引用<代码>已读取
默认为未读取

以下是表架构:

CREATE TABLE notification
    (`id` int, `modification_id` int,`pm_id` int,`is_read` int)
;

INSERT INTO notification
    (`id`,`modification_id`,`pm_id`,`is_read`)
VALUES
    (1,1,NULL,0),
    (2,NULL,1,0),
    (3,2,NULL,0)
;

CREATE TABLE user_modification
    (`modification_id` int, `user_id` int,`page_id` int, `is_approved` int)
;

INSERT INTO user_modification
    (`modification_id`,`user_id`,`page_id`,`is_approved`)
VALUES
    (1,1,5,1),
    (2,2,2,1),
    (3,3,3,0)

;

CREATE TABLE pm
    (`pm_id` int, `sender_id` int,`recipent_id` int,`msg` varchar(200))
;

INSERT INTO pm
    (`pm_id`,`sender_id`,`recipent_id`,`msg`)
VALUES
    (1,1,2,'Hello');

CREATE TABLE users
    (`user_id` int, `name`varchar(20))
;

INSERT INTO users
    (`user_id`,`name`)
VALUES
    (1,'Tom'),
    (2,'Peter'),
    (3,'David')
;
如果用户David登录,我希望得到一个通知的输出。每种消息类型的每一行

 notification_recipient  pm_sender    msg     modification_page_id 
 Peter                   Tom          Hello   NULL
 notification_recipient  pm_sender    msg     modification_page_id 
 Peter                   NULL         NULL    2
给Peter的通知如下:

        `1.You have received a private message from Tom.
         2.your modification on <a href='mysite.com/5'>that page</a> is approved`.
`1.您收到了汤姆的私人信息。
2.您对“”的修改已批准。

此查询应该可以完成此任务。这是

SELECT
  n.id,
  IF(pmu.name IS NULL, pmm.name, pmu.name) recipient, 
  pmus.name sender, pm.msg, m.modification_id
FROM
  notification n
  LEFT JOIN user_modification m ON (n.modification_id = m.modification_id)
  LEFT JOIN pm ON (n.pm_id = pm.pm_id)
  LEFT JOIN users pmu ON (pm.recipent_id = pmu.user_id)
  LEFT JOIN users pmus ON (pm.sender_id = pmus.user_id)
  LEFT JOIN users pmm ON (m.user_id = pmm.user_id)
WHERE
  (pmu.name = 'Peter' OR 
     pmm.name = 'Peter') AND
  n.is_read = 0;