3

次のテーブルがあります。

TABLE product
id int(11)
title varchar(400)

TABLE tag
id int(11)
text varchar(100)

TABLE product_tag_map
product_id int(11)
tag_id int(11)

PRODUCT_TAG_MAP はタグを商品にマップします。システム内のタグの分布は正常ではありません。つまり、一部のタグは他のタグよりもはるかに多くの製品を持っています。

25 個のランダムな製品を取得する SQL を作成しようとしています。タグごとに 5 個の製品、つまり 5 個のタグ (つまり 5x5 = 25) です。

ここで答えを見つけました: How can I get an even distribution using WHERE id IN(1,2,3,4)

ただし、これはランダムな商品を生成するわけではありません。タグごとに常に同じ商品を取得します。

これが私が持っているSQLです:

SET @last_tag = 0;
SET @count_tag = 0;

SELECT DISTINCT id FROM (
SELECT
  product.*,
  @count_tag := IF(@last_tag = product_tag_map.tag_id, @count_tag, 0) + 1 AS tag_row_number,
  @last_tag := product_tag_map.tag_id
FROM product
  LEFT JOIN product_tag_map ON (product_tag_map.product_id=product.id)
WHERE
  product_tag_map.tag_id IN (245,255,259,281,296)
) AS subquery WHERE tag_row_number <= 5;

タグごとにランダムな商品を返すにはどうすればよいですか?

どんな助けでも大歓迎です!ありがとう。

4

2 に答える 2