私は2つのテーブルを持っています。
1つのリストのこと -thing_id, thing_name, thing_status
その他の表には、それぞれの属性がリストされています。
attribute_id, attribute_thing, attribute_name, attribute_status
thing_id
=attribute_thing
私は基本的に、あるランダムなものを取得したいので、thing_status = 1
それをランダムな属性に結合する必要があります。attribute_status = 1
各モノには 0 から N 個の属性が含まれる場合があり、0 属性のモノが返される必要があります。モノに複数の属性がある場合、ランダムな属性が返されます。
次のクエリがあります。
SELECT * FROM things
LEFT JOIN attributes ON thing_id = attribute_thing AND attribute_status = 1
WHERE thing_status = 1
GROUP BY thing_id
ORDER BY rand()
LIMIT 1
ここでの問題は、常に最初の属性に JOIN することです (最も低いattribute_id
ものを使用します。ランダムなものを選択する必要があります。
GROUP BY 句の種類を削除することは機能しますが、多くの属性を持つものが選択される可能性がはるかに高くなります。したがって、30 個の属性を持つものは、1 つの属性を持つものよりも 30 倍の確率で選択されます。すべてのものを平等に扱ってほしい。