如何在mysql中连接到另一个表中的随机行?

时间:2012-06-11 20:34:46

标签: mysql

我有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倍。我希望所有事情都得到平等对待。

2 个答案:

答案 0 :(得分:0)

如果您只需要属性中的1个整数列,则可以执行以下操作:

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

...如果您需要更多,我看不到其他嵌套子查询的替代方案。

答案 1 :(得分: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从子查询中获取随机值,事实证明您在另一个子查询中包含子查询。