我有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倍。我希望所有事情都得到平等对待。
答案 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
从子查询中获取随机值,事实证明您在另一个子查询中包含子查询。