MySQL结合多个查询

时间:2016-10-26 17:31:33

标签: mysql sql mariadb

这是一个示例表。

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个请求是一个很大的优点。)

2 个答案:

答案 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 ;