3

我需要有关使用以下两个表设置的审查系统的查询的帮助。

评论
--------
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 是反对票。(ratingreviews 表中的列是星系统,不相关。)

加载评论时,我需要以我知道以下详细信息的方式加入 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 以查看他们是否对评论进行了投票,但这也感觉非常不干净。

预先感谢您提供的任何帮助。

4

2 回答 2

1

您可以修改 reviews_thumbs 看起来更像这样:

reviews_thumbs
--------------
review_id   user_id upvote downvote
1           22      1      0
1           45      0      1
2           40      0      1
3           22      1      0

这将有效地存储重复的信息,但是当你有一个好的目的时没关系。您确实有两件事想知道,这可以让您快速总结 2 列(并快速减去这些结果),以获得您正在寻找的内容。这可以减少您对 reviews_thumbs 表的 2 次查询,一次查询总数,一次查询用户特定操作。

于 2013-04-16T18:33:14.787 回答
0

不确定这是否会提高您的查询性能,但您可以尝试在子选择中进行计数

SELECT `reviews`.*,
(SELECT count(*) FROM reviews_thumbs t WHERE t.review_id =reviews.id AND t.like = 1) AS upVotes
...
FROM reviews
...  
于 2013-03-25T20:45:43.450 回答