我有以下查询,它给了我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 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;
与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那么会导致无限循环值)。