多个左连接返回双行


Mutliple left joins return double rows

我有4张表

    用户
  • <
  • 消息/gh>
  • friendrequests

我正在尝试在单个查询中获得朋友请求和新消息。它工作得很好,但当我离开加入' friendsrequests '时,我得到多行。

这是我的查询:

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

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

我不确定朋友表中的哪些字段对应于您请求的哪些字段。但是这里有一个使用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

如果你像你一样LEFT JOIN朋友请求和消息,你会得到消息的次数在你的结果集中的朋友请求的数量。在您的示例中,您有2个请求和2条消息,导致(2*2=)4行。

也许你应该考虑使用union代替?使用union,您将能够为每个朋友请求和每个消息获得一行。那应该更适合你的需要。但是,在示例中仍然会得到4行(2+2)。

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

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

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

现在通过在f1.contactid = users.id上连接friendrequests表,您可以在两个条目上连接用户3和用户12的请求,用户id为1,结果为:

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表连接到与消息或时间戳连接的东西上,因为这是唯一不同的列。