多个左连接返回双行

时间:2013-05-29 15:27:21

标签: php mysql sql database join

我有4张桌子

  • 用户
  • 图片
  • 消息
  • friendrequests

我正在尝试在单个查询中获取好友请求和新消息。它运作良好,但当我离开加入'friendsreuqests'时,我得到了多行。

这是我的问题:

SELECT username,
  f1.userid as reqId,
  m1.msg, m1.userid, 
  p1.picHash, p1.extension, UNIX_TIMESTAMP( m1.sent ) AS date
FROM users
  LEFT JOIN pictures p1 ON p1.userid = users.id
  LEFT JOIN messages m1 ON m1.contactid = users.id AND m1.delivered =0
  LEFT JOIN friendrequests f1 ON f1.contactid = users.id AND f1.delivered=0 AND f1.request =1
WHERE users.id =7
ORDER BY date ASC

这是MySQL的结果:

Kungen  3     gregegerg     1    dc825b1c8a35593be4d172db7    jpg    1369839537
Kungen  12    gregegerg     1    dc825b1c8a35593be4d172db7    jpg    1369839537
Kungen  3     HEJH          1    dc825b1c8a35593be4d172db7    jpg    1369839540
Kungen  12    HEJH          1    dc825b1c8a35593be4d172db7    jpg    1369839540

如你所见,结果加倍。我想在这一点上只获得两行。如果我有两条新消息,但没有新朋友请求那两行应为NULL。

4 个答案:

答案 0 :(得分:2)

如果您想在单个查询中获取好友请求消息,那么我希望该查询具有union all。您的查询正在表之间进行连接。这会将有关好友请求的信息添加为其他。你想要在额外的行中。

我不确定friends表中的哪些字段对应于您请求的字段。但这是使用union all的查询示例:

SELECT username, users.id as reqId, m1.msg, m1.userid, 
       p1.picHash, p1.extension, UNIX_TIMESTAMP( m1.sent ) AS date
FROM users LEFT JOIN
     pictures p1 ON p1.userid = users.id LEFT JOIN
     messages m1 ON m1.contactid = users.id AND m1.delivered =0 
WHERE users.id =7
union all
SELECT username, users.id as reqId, NULL, NULL, 
       NULL, NULL, UNIX_TIMESTAMP( f1.sent ) AS date
FROM users LEFT JOIN
     friendrequests f1
     ON f1.contactid = users.id AND f1.delivered=0 AND f1.request =1
ORDER BY date ASC

答案 1 :(得分:1)

如果LEFT JOIN朋友请求和您这样的消息,您将获得结果集中的朋友请求数量的消息数量。在您的示例中,您有2个请求和2个消息,导致(2 * 2 =)4行。

也许您应该考虑使用union代替?使用union,您可以为每个朋友请求获取一行,为每封邮件获取一行。这应该更适合您的需求。 不过,你的例子中仍会得到4行(2 + 2)。

答案 2 :(得分:0)

添加GROUP BY子句及其中的所有字段肯定会有所帮助,但您必须决定要保留的第二个字段的值(3或12)。 如果您肯定知道,该字段总共有两行不同,那么您可以同时选择MIN(m1.msg)MAX(m1.msg)

答案 3 :(得分:0)

问题是,在前两次加入之后,如果我正确的话,你会得到这个:

Kungen  gregegerg       1   dc825b1c8a35593be4d172db7   jpg     1369839537
Kungen  HEJH            1   dc825b1c8a35593be4d172db7   jpg     1369839540

现在加入f1.contactid = users.id上的friendrequests表,您加入了对用户ID为1的两个条目的用户3和12的请求,导致:

Kungen  3   gregegerg       1   dc825b1c8a35593be4d172db7   jpg     1369839537
Kungen  12  gregegerg       1   dc825b1c8a35593be4d172db7   jpg     1369839537
Kungen  3   HEJH            1   dc825b1c8a35593be4d172db7   jpg     1369839540
Kungen  12  HEJH            1   dc825b1c8a35593be4d172db7   jpg     1369839540

现在要获得正确的结果,您需要在与消息或时间戳连接的内容上加入friendrequests表,因为这是唯一不同的列。