我有这张桌子:
我想在发布的情况下获得2条随机行,并且具有不同的位置值(例如:如果第一行是垂直行,第二行必须是水平行)。
我尝试过
SELECT * FROM publicity where published = 1 and location = 'vertical'
UNION
SELECT * FROM publicity where published = 1 and location = 'horizontal'
ORDER BY rand() LIMIT 2
有时它会给我两行具有相同位置值的信息。
答案 0 :(得分:0)
您的要求要求从两组不同的项目中随机抽取项目。您呼叫了一个horizontal
,另一个呼叫了vertical
。因此,您必须获得这两个随机项目,然后将它们合并。
SELECT * FROM (SELECT whatever FROM table WHERE location='horiz' ORDER BY RAND() LIMIT 1) h
UNION ALL
SELECT * FROM (SELECT whatever FROM table WHERE location='vert' ORDER BY RAND() LIMIT 1) v
如果将ORDER BY RAND() LIMIT 1
操作应用于整个结果集,则可能会从一个位置获得两个项目。
这两个查询被包装在SELECT * FROM (SELECT ... ) a
中,因为MySQL希望在合并后应用ORDER
和LIMIT
子句。
为什么UNION ALL
?因为UNION
对结果集进行了重复数据删除,所以您不需要这样做。
专业提示:ORDER BY RAND() LIMIT 1
可以正常运行,但是众所周知,它运行缓慢,特别是在大桌子上。