我整日都在尝试获取SQL查询的结果,但没有给我预期的结果。

我咨询的表格如下:

tcc_friends

id(PK AUTO_INCREMENT)
user_from (FK tcc_user (nickname) )
user_to (FK tcc_user (nickname) )


tcc_messages

id (PK AUTO_INCREMENT)
message
reg_time
wasRead
id_room (FK tcc_friends(id))


当前插入的测试记录是:

tcc_friends

id_room    user_from    user_to
5             hu        [email protected]
6             hu        [email protected]


tcc_messages

id          message      id_room
1           a            5
2           b            5
3           c            3


SQL:

select
    u.*,
    f.id_room,COUNT(m.id) as newMessages
from
    tcc_friends f,
    tcc_user u,
    tcc_messages m
where
    u.nickname = 'hu' IN (u.nickname = f.user_from and f.user_to='hu') or
    (u.nickname = f.user_to and f.user_from='hu') AND
    (m.id_room = f.id_room and m.wasRead = 0)
GROUP BY
    u.nickname;


结果:

id   nickname                id_room    newMessages
81   [email protected]       5          2


我试图吸引用户的朋友,并添加未读消息,但仅显示有消息的朋友,我想向所有朋友显示是否未读

有谁能够帮助我?问候和谢谢大家

最佳答案

首先,不要使用SELECT *。这是一种可怕的做法,您应该摆脱尽快这样做的习惯。

其次,学习如何使用显式JOIN。不要在WHERE子句中列出所有表。该语法已经过时了20年(有充分的理由)。这也是造成您的问题的原因,因为默认情况下所有联接都是INNER JOIN

尝试这样的事情:

SELECT
    U.id,
    U.nickname,
    F.id_room,
    COUNT(M.id) as newMessages
FROM
    tcc_Friends F
INNER JOIN tcc_User U ON U.nickname = F.user_from
LEFT OUTER JOIN tcc_Messages M ON
    M.id_room = F.id_room AND
    M.wasRead = 0  -- Are you using camelcase or underscores in column names?? Make up your mind and stick to it.
WHERE
    F.user_to = 'hu'
GROUP BY
    U.nickname;


这并不能使您一路顺风,因为我不清楚您到底想达到什么程度,以达到未读消息的数量—是用户的未读消息吗? [email protected]如何有2个?

关于mysql - 好友列表和未读消息SQL查询产生意外结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37283023/

10-12 13:26