2

我有 2 张桌子。

一份清单——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

这里的问题是它总是加入第一个属性(attribute_id那个东西最低。我需要选择一个随机的。

删除 GROUP BY 子句是可行的,但是具有许多属性的东西更有可能被选中。因此,具有 30 个属性的事物被选中的可能性是具有 1 个属性的事物的 30 倍。我希望所有的事情都一视同仁。

4

2 回答 2

0

If you need only 1 integer column from attributes, you could do something like:

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

... if you need more, I see no alternatives other nesting some subqueries.

于 2012-06-11T20:51:13.657 回答
0

Try this:

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

To get a random value from a subquery via ORDER BY RAND() LIMIT 1, turns out you have the wrap the subquery in another subquery.

于 2012-06-11T20:54:36.877 回答