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