MySQL网站审核系统


MySQL Review System for Website

我需要帮助,查询涉及一个审查系统设置与以下两个表。

<>之前评论-------Id date user_id item_id rating review1 02-2012 40 456 3 '我喜欢它'2 03-2012 22 342 1"我不喜欢它"3 04-2012 45 548 0 '我讨厌它'之前<>之前reviews_thumbs--------------Review_id user_id like1 22 11 45 -12 40 -13 22 1之前

"reviews_thumbs"表的存在是为了跟踪评论的好评和反对票,这样评论就可以根据质量进行评级。在"喜欢"一栏中,1表示赞成,-1表示反对。(评论表中的rating列是一个星型系统,不相关)

当加载评论时,我需要以这样一种方式加入reviews_thumbs表,以便我知道以下详细信息(对于每个返回的评论):

<>之前1. 投票总数2. 反对票的总数3.当前活跃用户是否对评论投了赞成票或反对票之前

我使用下面的查询完成了这个任务,这对我来说不是很合适:

<>之前选择"审查"。*,COUNT(upVoteTable. ' user_id ')作为upVotes,COUNT(downVoteTable. ' user_id ')作为downVotes,COUNT(userUpTable. ' user_id ') AS userUp,COUNT(userDownTable. ' user_id ')作为userDown从"评论"左JOIN ' reviews_thumbs '为upVoteTableupVoteTable。' review_id ' = ' reviews ' . ' id '和upVoteTable。' like ' = 1左JOIN ' reviews_thumbs '作为downVoteTabledownVoteTable。' review_id ' = ' reviews ' . ' id '和downVoteTable。' like ' = -1左连接' reviews_thumbs '作为userUpTableuserUpTable。' review_id ' = ' reviews ' . ' id '和userUpTable。' like ' = 1和userUpTable。' user_id ' =:用户id左连接' reviews_thumbs '作为userDownTableuserDownTable。' review_id ' = ' reviews ' . ' id '和userDownTable。' like ' = -1和userDownTable。' user_id ' =:用户id"item_id"=:itemid按"评论"、"id"分组按"日期"订购之前

(并绑定适当的:userid和:itemid)

所以这个查询工作完美,完成了我需要的。但这是很多人的加入,我几乎肯定会有更好的方法来做到这一点,但我似乎什么也想不出来。

有没有人能给我指出正确的方向,告诉我如何以更干净的方式完成这件事?

我试过了:

我试过做一个GROUP_CONCAT,列出一个包含所有用户id和喜欢的字符串,然后运行一个正则表达式来找到用户的id,看看他们是否对评论进行了投票,但这也感觉真的很不干净。

事先感谢您提供的任何帮助

你可以这样修改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

这将有效地存储重复信息,但如果您有好的目的,这是可以的。你确实有两个你想知道的东西,这给了你一个快速的两列求和(以及对这些结果的快速减法),以得到你想要的东西。这样可以将reviews_thumbs表的查询次数减少到2次,一次查询总数,一次查询用户特定的操作。

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

中进行计数。
SELECT `reviews`.*,
(SELECT count(*) FROM reviews_thumbs t WHERE t.review_id =reviews.id AND t.like = 1) AS upVotes
...
FROM reviews
...