选择随机行,但不重复其他列中的值

时间:2019-03-14 17:40:00

标签: mysql sql random

我有以下查询,该查询为我提供了3个随机名称,id和top_tags:

SELECT  Name
     , id
     , top_tag 
  FROM artists 
 WHERE  not find_in_set (id,'1,2,3,4') 
 order 
    by rand() 
 limit 3

它工作正常,但是,我确实需要其他条件。 我有一个列名top_tag(int),我需要结果将包括3个唯一的top_tag值,而不是top_tag的重复项。

2 个答案:

答案 0 :(得分:1)

在MySQL 8+中,您将使用窗口函数:

SELECT Name, id, top_tag 
FROM (SELECT a.*, ROW_NUMBER() OVER (PARTITION BY top_tag ORDER BY rand()) as seqnum
      FROM artists a
      WHERE id NOT IN (1, 2, 3, 4) 
     ) a
WHERE seqnum = 1
LIMIT 3;

答案 1 :(得分:0)

类似于戈登的答案,但这可以确保三个不同且随机的top_tag:

SELECT Name, id, top_tag
FROM (
    SELECT name, id, top_tag, 
      ROW_NUMBER() OVER (PARTITION BY top_tag ORDER BY RAND()) AS seqnum
    FROM (
      SELECT DISTINCT top_tag FROM artists 
      WHERE id NOT IN (1,2,3,4) 
      ORDER BY RAND() LIMIT 3) AS t
    JOIN artists AS a ON (t.top_tag = a.top_tag)
    WHERE a.id NOT IN (1,2,3,4)
) AS x
WHERE seqnum = 1

或者您可以继续使用原始查询,但增加样本量:

SELECT Name, id, top_tag 
FROM artists 
WHERE id NOT IN (1,2,3,4)
ORDER BY RAND() LIMIT 30 

然后在您的应用中,获取更多结果,直到三行具有不同的top_tag值,并丢弃具有任何已获取的top_tag值的行。如果您通过了全部30个操作,但仍然没有获得三个不同的标签,请重试(但请注意不要无限期地重试,因为如果您的数据中不包含两个以上的top_tag,这将导致无限循环值)。