我需要帮助处理一个涉及评论系统的查询,该查询使用以下两个表进行设置。
reviews ------- id 日期 user_id item_id rating review 1 02-2012 40 456 3 '我喜欢它' 2 03-2012 22 342 1 '我不喜欢它' 3 04-2012 45 548 0 '我讨厌它'
reviews_thumbs -------------- review_id user_id like 1 22 1 1 45 -1 2 40 -1 3 22 1
“reviews_thumbs”表用于跟踪评论的赞和踩,以便可以根据质量对评论进行评分。在“like”列中,1表示赞,-1表示踩。(reviews表中的“rating”列是星级系统,与此无关。)
在加载评论时,我需要以这样一种方式连接reviews_thumbs表,以便我知道以下细节(对于返回的每个单独的评论):
1.赞的总数 2.踩的总数 3.当前活动用户是否点赞或点踩了评论
我使用以下查询成功实现了这一点,但我感觉不太对:
SELECT `reviews`.*, COUNT(upVoteTable.`user_id`) AS upVotes, COUNT(downVoteTable.`user_id`) AS downVotes, COUNT(userUpTable.`user_id`) AS userUp, COUNT(userDownTable.`user_id`) as userDown
FROM `reviews`
LEFT JOIN `reviews_thumbs` AS upVoteTable ON upVoteTable.`review_id` = `reviews`.`id` AND upVoteTable.`like` = 1
LEFT JOIN `reviews_thumbs` AS downVoteTable ON downVoteTable.`review_id` = `reviews`.`id` AND downVoteTable.`like` = -1
LEFT JOIN `reviews_thumbs` AS userUpTable ON userUpTable.`review_id` = `reviews`.`id` AND userUpTable.`like` = 1 AND userUpTable.`user_id` = :userid
LEFT JOIN `reviews_thumbs` AS 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。)
这个查询完美地实现了我的目标,但是涉及到很多JOIN操作,我几乎肯定有更好的方法来完成它,但我似乎无法想出任何其他的方法。
请问是否有人可以指导一下如何以更简洁的方式实现这个查询?
我尝试过使用GROUP_CONCAT来列出一个包含所有用户ID和点赞信息的字符串,然后运行正则表达式来查找用户ID以查看他们是否对评论进行了投票,但这种方法感觉非常不干净。谢谢您提供的任何帮助。
reviews ------- id 日期 user_id item_id rating review 1 02-2012 40 456 3 '我喜欢它' 2 03-2012 22 342 1 '我不喜欢它' 3 04-2012 45 548 0 '我讨厌它'
reviews_thumbs -------------- review_id user_id like 1 22 1 1 45 -1 2 40 -1 3 22 1
“reviews_thumbs”表用于跟踪评论的赞和踩,以便可以根据质量对评论进行评分。在“like”列中,1表示赞,-1表示踩。(reviews表中的“rating”列是星级系统,与此无关。)
在加载评论时,我需要以这样一种方式连接reviews_thumbs表,以便我知道以下细节(对于返回的每个单独的评论):
1.赞的总数 2.踩的总数 3.当前活动用户是否点赞或点踩了评论
我使用以下查询成功实现了这一点,但我感觉不太对:
SELECT `reviews`.*, COUNT(upVoteTable.`user_id`) AS upVotes, COUNT(downVoteTable.`user_id`) AS downVotes, COUNT(userUpTable.`user_id`) AS userUp, COUNT(userDownTable.`user_id`) as userDown
FROM `reviews`
LEFT JOIN `reviews_thumbs` AS upVoteTable ON upVoteTable.`review_id` = `reviews`.`id` AND upVoteTable.`like` = 1
LEFT JOIN `reviews_thumbs` AS downVoteTable ON downVoteTable.`review_id` = `reviews`.`id` AND downVoteTable.`like` = -1
LEFT JOIN `reviews_thumbs` AS userUpTable ON userUpTable.`review_id` = `reviews`.`id` AND userUpTable.`like` = 1 AND userUpTable.`user_id` = :userid
LEFT JOIN `reviews_thumbs` AS 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。)
这个查询完美地实现了我的目标,但是涉及到很多JOIN操作,我几乎肯定有更好的方法来完成它,但我似乎无法想出任何其他的方法。
请问是否有人可以指导一下如何以更简洁的方式实现这个查询?
我尝试过使用GROUP_CONCAT来列出一个包含所有用户ID和点赞信息的字符串,然后运行正则表达式来查找用户ID以查看他们是否对评论进行了投票,但这种方法感觉非常不干净。谢谢您提供的任何帮助。