我有以下查询,该查询为我提供了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
的重复项。
答案 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,这将导致无限循环值)。