3

テーブルから特定のオブジェクトを気に入ったユーザーをプルするクエリがありusersます。評価はratingsテーブルに保存されます。私がこれまでに思いついたクエリは次のようになります。

SELECT user.id, user.name, user.image
  FROM users
LEFT JOIN ratings ON ratings.userid = user.id
WHERE rating.rating > 0
  AND rating.objectId IN (1,2,3,4)

LIMITIDごとに3つ程度の結果しか必要ない場合に、すべての結果が返されないように、このクエリにを追加できるようにしたいと思います。たとえばLIMIT 12、1つのIDで8つのレコードを取得し、他のレコードではそれぞれ1つまたは2つのレコードを取得する可能性があります。つまり、ID間での不均一な分布です。

(オブジェクトが少なくとも3回「いいね」されたと仮定して)、リスト内のIDごとに3つの結果が得られることを保証するように、このクエリを作成する方法はありますか?

4

1 に答える 1

2

行番号whit変数を設定し、その結果をフィルタリングして、行1〜3のみが機能するように表示します。

SET @last_objectId = 0;
SET @count_objectId = 0;
SELECT id, name, image FROM (
SELECT
 user.id,
 user.name,
 user.image,
 @count_objectId := IF(@last_objectId = rating.objectId, @count_objectId, 0) + 1 AS rating_row_number,
 @last_objectId := rating.objectId
FROM users
LEFT JOIN ratings ON (ratings.userid = user.id)
WHERE
 rating.rating > 0 AND
 rating.objectId IN (1,2,3,4)
ORDER BY rating.objectId
) AS subquery WHERE rating_row_number <= 3;
于 2012-06-27T19:54:32.497 に答える