【问题标题】:MySQL COUNT function not performing as I would like in multiple joined queryMySQL COUNT 函数在多个连接查询中未按我的意愿执行
【发布时间】:2011-08-29 01:34:18
【问题描述】:

我已经修改了一段时间的查询,阅读了这个精彩网站上的许多帖子,以了解我目前的情况。但是,唉,现在我被困住了:(

我设计的这个查询和数据库的相关部分类似于 youtube 评论点赞系统。相关表格和字段是:

美国海军陆战队
usr_id int (PK)

评论
comment_id int (PK) usr_id int (FK) 引用 usr(usr_id) topic_id int (FK) 引用主题(topic_id) 描述 varchar 创建了 varchar

COMMENT_LIKERS
comment_id int (PK) (FK) 引用 cmets(comment_id) usr_id int (PK) (FK) 引用 usrs(usr_id) 喜欢tinyint

我希望能够在一个查询中选择所有相关数据。除了每条评论的一般数据外,我还想统计每条评论的所有喜欢和不喜欢的情况。到目前为止,我的查询是计算所有 cmets 的点赞数,而不是每个 cmets 的点赞数,即使我有 LEFT JOIN with ON 子句:cmets.comment_id = comment_likers.comment_id。

我正在学习 MySql 和 PHP,所以如果我做了一些愚蠢的事情,请放心。我向你保证,我已经四处寻找答案的线索。

这里是查询:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name,
  COUNT(if(comment_likers.liker = 1, 1, null)),
  COUNT(if(comment_likers.liker = 0, 1, null)),
  comment_likers2.liker
FROM comments
INNER JOIN usrs ON ( comments.usr_id = usrs.usr_id )
LEFT JOIN comment_likers ON ( comments.comment_id = comment_likers.comment_id )
LEFT JOIN comment_likers AS comment_likers2 ON ( comments.comment_id = comment_likers.comment_id AND comment_likers.usr_id = $usrID )
WHERE comments.topic_id = $tpcID
GROUP BY comments.comment_id
ORDER BY comments.created DESC

提前致谢

【问题讨论】:

  • 我不认为这是你的问题,但我会在 where 子句中而不是 join 中放置“ AND comment_likers.usr_id = $usrID”。
  • 我不知道我是不是发疯了,盯着这段代码太久了......但我知道你的意思,我已经将其他查询中的类似 AND 切换到 WHERE子句没有明显区别,但我只是尝试使用这个,查询甚至不起作用......没有找到 cmets
  • 我应该在我的评论中添加这个链接,我在寻找这个项目的答案时偶然发现了这个链接:techstumbler.blogspot.com/2008/04/mysql-join-with-count.html我现在就去睡觉,希望明天有答案和一个新的头脑

标签: mysql count aggregate-functions


【解决方案1】:
SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=1)likes,
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=0)dislikes
  liker
FROM comments
INNER JOIN usrs ON ( comments.usr_id = usrs.usr_id )
LEFT JOIN comment_likers  ON ( comments.comment_id = comment_likers.comment_id 
 AND comment_likers.usr_id = $usrID )
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;

几个笔记。我不太确定comment_likers 上的第二个左连接应该完成什么(使用$usrID 的那个)。您是否只对特定用户对特定主题的喜欢感兴趣?

另外,您可能会考虑将 cmets created 的架构更改为日期时间而不是 varchar。

【讨论】:

  • 工作完美,非常感谢!我想知道子查询,但对它们没有足够的理解来了解如何在我的查询中实现它们,现在我知道了!一旦我得到代表投票,我就会投票赞成!在回答您的第一个注释时,是的,我确实还打算为当时浏览页面的特定用户获取每条评论的喜欢/不喜欢。当我在这里打字时,创建的内容对我来说是一个糟糕的事情。这确实是我数据库中的日期时间。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多