Mysql SQL查询返回包含另一列数据的列

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 以

我有一个表通知连接到表喜欢和评论。当我为用户返回通知时,我也会创建列:喜欢的数量、评论的数量和我喜欢的数量。当进行查询的用户不喜欢某个通知(liked_by_me=0)时,查询工作正常。但是如果他们有(喜欢我=1),我得到的喜欢的数量的值是错误的,并且与评论的数量相同

例如:

1)
-我喜欢=错误
-喜欢=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;