这是一个示例表。
ColZero | ColOne | RoColTwo
--------+--------+--------
1 | one | tag1
2 | two | tag1
3 | three | tag2
4 | four | tag2
5 | five | tag3
我有以下查询。
SELECT `ColOne` FROM `Table` WHERE `ColTwo` = ? ORDER BY rand() LIMIT 1;
我想在一个查询中使用多个RowTwo
值来选择多行,但每行仍然必须是随机的。
这涉及将此查询的可变数量的实例合并到一个新的单个查询中。
如何在一个查询中完成此操作? (我试图尽快做到这一点,所以在一个请求中完成所有操作,而不是10-30个请求是一个很大的优点。)
答案 0 :(得分:2)
执行所需操作的最有效方法可能是使用变量:
SELECT t.*
FROM (SELECT t.*,
(@rn := if(@r = RowTwo, @rn + 1,
if(@r := RowTow, 1, 1)
)
) as rn
FROM `Table` t CROSS JOIN
(SELECDT @r := '', @rn := 0) params
WHERE `RowTwo` IN (?, ?, ?)
ORDER BY RowTwo, rand()
) t
WHERE rn = 1;
如果您不想使用动态SQL,并且希望支持无限数量的值,则可以考虑:
WHERE FIND_IN_SET(RowTwo, ?) > 0
无论如何,命名列ROW会导致(至少对我而言)认知失调。
答案 1 :(得分:1)
您可以为RowTo
使用不同的值SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1
union
SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1
union
SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1
union
SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1 ;