我需要有关使用以下两个表设置的审查系统的查询的帮助。
评论 -------- id 日期 user_id item_id 评分评论 1 02-2012 40 456 3 “我喜欢” 2 03-2012 22 342 1 “我不喜欢” 3 04-2012 45 548 0 “我讨厌它”
评论_拇指 -------------- review_id user_id 喜欢 1 22 1 1 45 -1 2 40 -1 3 22 1
存在“reviews_thumbs”表以跟踪评论的赞成票和反对票,以便可以按质量对评论进行评级。在“喜欢”列中,1 是赞成票,-1 是反对票。(rating
reviews 表中的列是星系统,不相关。)
加载评论时,我需要以我知道以下详细信息的方式加入 reviews_thumbs 表(对于每个单独的评论,因为它们被返回):
1. 点赞总数 2. 反对票总数 3. 当前活跃用户是否对评论投了赞成票或反对票
我已经使用以下查询完成了此操作,但我并不适合:
选择“评论”。*, COUNT(upVoteTable.`user_id`) 作为 upVotes, COUNT(downVoteTable.`user_id`) 作为 downVotes, COUNT(userUpTable.`user_id`) 作为用户, COUNT(userDownTable.`user_id`) as userDown 来自“评论” LEFT JOIN `reviews_thumbs` 作为 upVoteTable 在 upVoteTable.`review_id` = `reviews`.`id` AND upVoteTable.`like` = 1 LEFT JOIN `reviews_thumbs` 作为 downVoteTable ON downVoteTable.`review_id` = `reviews`.`id` AND downVoteTable.`like` = -1 LEFT JOIN `reviews_thumbs` 作为 userUpTable ON userUpTable.`review_id` = `reviews`.`id` AND userUpTable.`like` = 1 AND userUpTable.`user_id` = :userid LEFT JOIN `reviews_thumbs` 作为 userDownTable ON userDownTable.`review_id` = `reviews`.`id` AND userDownTable.`like` = -1 AND userDownTable.`user_id` = :userid WHERE `item_id`=:itemid GROUP BY `reviews`.`id` ORDER BY `date` DESC
(并绑定适当的 :userid 和 :itemid。)
所以这个查询完美地工作并完成了我所需要的。但这是一个很大的加入,我几乎肯定肯定有更好的方法来做到这一点,但我似乎无法弄清楚任何事情。
有人可以为我指出如何以更清洁的方式完成此任务的正确方向吗?
我试过的:
我试过做一个 GROUP_CONCAT,列出一个包含所有用户 id 和喜欢的字符串,然后运行一个正则表达式来查找用户的 id 以查看他们是否对评论进行了投票,但这也感觉非常不干净。
预先感谢您提供的任何帮助。