我整日都在尝试获取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/