好友列表和未读消息SQL查询给出意外结果

时间:2016-05-17 17:42:46

标签: mysql sql select

我整天都试图获得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        example@gmail.com
6             hu        example222222@hotmail.com

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   example@gmail.com       5          2

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

任何人都可以帮助我吗?关心并谢谢大家

2 个答案:

答案 0 :(得分:1)

首先,不要使用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;

这并不能让你一路走到那里,因为我不清楚你到底想要获得多少未读消息 - 是不是未读消息用户呢? example@gmail.com有2个怎么样?

答案 1 :(得分:0)

and m.wasRead = 0子句中的m.id_room = f.id_room and m.wasRead = 0中删除WHERE。通过此查询,您只能获得具有wasRead属性0的消息的朋友。通过执行上述更改,您将获得所有朋友,如果他们没有任何新消息,则会获得0作为计数。