3

次の2つのテーブルで設定されたレビューシステムを含むクエリについてサポートが必要です。

レビュー
-------
id日付user_iditem_id評価レビュー
1 02-2012 40 4563'私はそれが好きです'
2 03-2012 22 3421'私はそれが好きではありません'
3 04-2012 45 5480'嫌い'
reviews_thumbs
--------------
review_id user_id like
1 22 1
1 45 -1
2 40 -1
3 22 1

「reviews_thumbs」テーブルは、レビューの賛成票と反対票を追跡するために存在し、レビューを品質で評価できるようにします。「like」列では、1は賛成票、-1は反対票です。(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`レビュー`

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`

`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つのことを持っています、そしてこれはあなたが探しているものを正確に得るためにあなたに2つの列の速い合計(そしてそれらの結果の速い減算)を与えます。これにより、reviews_thumbsテーブルのクエリを2倍に減らすことができます。1回は合計に対して、もう1回はユーザー固有のアクションに対してです。

于 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 に答える