我有3个表:SQL请求多个左连接和零
* User : iduser , pseudo, password, email, admin
* Message : idmessage, sender, recipient, time, message
* Contact : user1, user2 (both refer to id user)
我正在寻找一种方式来获得接触与最后的消息特定ID用户发送或接收邮件的时间。 (如果可能,请按时间排序)
在联系人表中,联系人只有一个条目,因此如果user1和user2是朋友,则该表中只有一个条目(user1:iduser1,user2:iduser2 )。
我可以接触:
SELECT iduser, pseudo, email
FROM user WHERE iduser!=/*ID GENERATED BY PHP*/
AND (
iduser
IN (
SELECT user1
FROM contact c1
WHERE c1.user1=user.iduser
UNION
SELECT user2
FROM contact c2
WHERE c2.user2=user.iduser))
我可以联系和消息,但仅适用于谁在数据库中至少有一个消息接触。我会使用LEFT JOIN,但问题是iduser可以与发件人或收件人匹配,所以我不能只执行LEFT JOIN所需的一个关系。因此,此请求仅适用于有邮件的联系人,您是否可以帮助我调整此请求以获取来自用户的所有联系人,并只有最后一条邮件存在?
这是我用来获取与信息联系方式只有
SELECT iduser, pseudo, email, idmessage, message, time
FROM user, message m1
WHERE (sender=iduser OR recipient=iduser)
AND iduser!=4 AND (iduser
IN (SELECT user1
FROM contact c1
WHERE c1.user1=user.iduser
UNION
SELECT user2
FROM contact c2
WHERE c2.user2=user.iduser)
)
AND time=(SELECT MAX(time)
FROM message m2
WHERE (sender=user.iduser
OR recipient=user.iduser))
结果我早就:
IDuser Pseudo Email Message Time
1 Jean [email protected] Hi! 2014-03-04 15:00
2 Luc [email protected] Hello! 2014-03-05 23:00
4 Paul [email protected] Bye! 2014-03-06 15:00
6 Tom [email protected] Hey! 2014-03-07 14:00
我解释什么我会。有一个由PHP 生成的IDUser我会有:用户的朋友给出的Id,伪和电子邮件。它符合我的第一个要求。但是我会得到更多的信息,对于给定用户的所有联系人,我会得到行用户的最后一条消息。如果联系人没有发送或收到任何消息,我也会让用户进入列表。
你可以,你知道,做'LEFT JOIN为C ON(u.id = C接触。 user1或u.id = c.user2)'这有帮助吗?如果不是,请给出一个更清晰的结果集示例。 – 2014-09-06 13:13:41
我试图用这个解决方案,但它不起作用,也许我找不到正确的方式来使用它。我编辑我的帖子来解释更多。谢谢 – X4V18 2014-09-06 13:23:06
我在你的表定义中看不到列'iduser'。什么是'iduser'? – Bohemian 2014-09-06 13:25:21