Mysql SQL查询返回包含另一列数据的列
我有一个表通知连接到表喜欢和评论。当我为用户返回通知时,我也会创建列:喜欢的数量、评论的数量和我喜欢的数量。当进行查询的用户不喜欢某个通知(liked_by_me=0)时,查询工作正常。但是如果他们有(喜欢我=1),我得到的喜欢的数量的值是错误的,并且与评论的数量相同 例如: 1)Mysql SQL查询返回包含另一列数据的列,mysql,sql,database,Mysql,Sql,Database,我有一个表通知连接到表喜欢和评论。当我为用户返回通知时,我也会创建列:喜欢的数量、评论的数量和我喜欢的数量。当进行查询的用户不喜欢某个通知(liked_by_me=0)时,查询工作正常。但是如果他们有(喜欢我=1),我得到的喜欢的数量的值是错误的,并且与评论的数量相同 例如: 1) -我喜欢=错误 -喜欢=1 -评论=5 返回值: -被我喜欢=0 -喜欢的数量=1 -注释的数量=5 2) -我喜欢=真的 -喜欢=2 -评论=5 返回值: -我喜欢你=1 -喜欢的数量=5 -注释的数量=5 以
-我喜欢=错误
-喜欢=1
-评论=5 返回值:
-被我喜欢=0
-喜欢的数量=1
-注释的数量=5 2)
-我喜欢=真的
-喜欢=2
-评论=5 返回值:
-我喜欢你=1
-喜欢的数量=5
-注释的数量=5 以下是我正在使用的查询:
SELECT notices.*
, count(comment.id) as number_of_comments
, count(like1.user_id) as number_of_likes
, like2.user_id IS NOT NULL AS liked_by_me
, boards.name as board_name
FROM notices
LEFT JOIN comments as comment
ON (comment.notice_id = notices.id)
LEFT JOIN likes as like1
ON (like1.notice_id = notices.id)
LEFT JOIN likes as like2
ON (like2.notice_id = notices.id
AND like2.user_id = $1)
LEFT JOIN boards
ON (boards.id = notices.board_id)
LEFT OUTER JOIN board_users
ON (board_users.board_id = notices.board_id)
WHERE board_users.user_id = $1
GROUP BY notices.id
, boards.name
, like2.user_id
, userId
任何帮助都将不胜感激。我已经做了几个小时了,我不认为我能找到问题
谢谢
解决方案:
这是工作查询
SELECT notices.*,
(SELECT COUNT(user_id) from likes WHERE likes.notice_id = notices.id) AS number_of_likes,
(SELECT user_id IS NOT NULL from likes WHERE likes.notice_id = notices.id AND likes.user_id = $1) AS liked_by_me,
count(comments.id) as number_of_comments, boards.name as board_name
FROM notices LEFT JOIN comments ON (comments.notice_id = notices.id)
LEFT JOIN boards ON (boards.id = notices.board_id)
LEFT OUTER JOIN board_users ON (board_users.board_id = notices.board_id)
WHERE board_users.user_id = $1 GROUP BY notices.id, boards.name", user);
您必须使用子选择。 关于这个问题的优秀文章: TL;DR:基本上,你必须意识到,你所有的评论和喜欢都被彼此放大了。尝试在不显示group子句的情况下显示查询结果,以查看重复的喜欢/评论是否被计数 编辑:我没有对此进行测试,但这是查询的外观: (也就是说,如果用户只能喜欢一个通知一次,否则您也必须对当前用户的喜好进行分组)
非常感谢。你的建议真的帮我弄明白了。因此,我尝试在联接中使用subselect,但它们仍然需要分组,并且合谋字段仍然返回错误的值。通过在查询的列声明中添加subselect,我最终获得了正确的值。没有经过测试,但这就是我的想法。我不确定列中的子选择查询的性能如何。
SELECT
notices.*,
comments.number_of_comments,
likes.number_of_likes
current_user_likes.user_id IS NOT NULL AS liked_by_me
boards.name AS board_name
FROM notices
LEFT JOIN (
SELECT
COUNT(*) AS number_of_comments,
notice_id
FROM comments
GROUP BY notice_id
) AS comments ON comments.notice_id = notices.id
LEFT JOIN (
SELECT
COUNT(*) AS number_of_likes,
notice_id
FROM likes
GROUP BY notice_id
) AS likes ON likes.notice_id = notices.id
LEFT JOIN likes AS current_user_likes
ON current_user_likes.notice_id = notices.id
AND current_user_likes.user_id = $1
LEFT JOIN boards ON boards.id = notices.board_id
INNER JOIN board_users
ON board_users.board_id = notices.board_id
AND board_users.user_id = $1;