选择随机行但不重复另一列的值

问题描述 投票:0回答:2

我有以下查询,它给了我3个随机名称,ids和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的重复。

mysql sql random
2个回答
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;

0
投票

与Gordon的答案类似,但这可能会确保三个截然不同的随机top_tags:

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那么会导致无限循环值)。

© www.soinside.com 2019 - 2024. All rights reserved.