我有4张桌子
我正在尝试在单个查询中获取好友请求和新消息。它运作良好,但当我离开加入'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。
答案 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表,因为这是唯一不同的列。