我整天都试图获得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
我试图吸引用户的朋友并添加未读消息,但仅显示有消息的朋友,并且我想向所有朋友展示是否未读
任何人都可以帮助我吗?关心并谢谢大家
答案 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作为计数。