2

私は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 倍の確率で選択されます。すべてのものを平等に扱ってほしい。

4

2 に答える 2

0

これを試して:

SELECT 
    *
FROM 
    things a
LEFT JOIN
    attributes b ON a.thing_id = b.attribute_things AND b.attribute_status = 1
WHERE
    a.thing_id = 
    (
        SELECT c.thing_id
        FROM
        (
            SELECT thing_id
            FROM things
            WHERE thing_status = 1
            ORDER BY RAND()
            LIMIT 1
        ) c
    )
ORDER BY
    RAND()
LIMIT 1

を介してサブクエリからランダムな値を取得するには、ORDER BY RAND() LIMIT 1のサブクエリでサブクエリをラップしていることがわかります。

于 2012-06-11T20:54:36.877 に答える
0

属性から整数列が 1 つだけ必要な場合は、次のようにすることができます。

 SELECT SUBSTRING_INDEX(GROUP_CONCAT(attributes.id ORDER BY RAND() SEPARATOR ',')),',',1)

...さらに必要な場合は、いくつかのサブクエリをネストする以外に選択肢はありません。

于 2012-06-11T20:51:13.657 に答える