比方说,我有一张桌子Songs(标题,歌曲作者)。 我想获得一张歌曲列表,其中同一位词曲作者的歌曲出现在一个方块中。所以我只是排序:
SELECT * FROM Songs ORDER BY songwriter ASC
但是现在,如果不同的词曲作者不一定总是以相同的顺序出现,那就太好了。我想要一个输出,在这些输出中,歌曲作者将不会总是像
a,a,a,b,c,c,d,e,e,e,e
但也喜欢
b,c,c,a,a,a,e,e,e,d
例如。我知道我可以使用
SELECT songwriter FROM Songs GROUP BY songwriter ORDER BY RAND()
然后按返回顺序对每个歌曲作者进行查询,但我真的很想只使用一个查询就拥有一个结果表。
到目前为止,我唯一的想法是通过哈希函数进行排序,该哈希函数每次执行查询时都会随机选择。这样一来,同一位词曲作者就可以相互出现,同时又可以混合使用不同的值。 但这似乎也太复杂了,我不知道如何每次都以一种不错的方式实现选择哈希。
是否有任何干净的方法仅用一个结果表来完成任务?可以分组,然后在一个查询中再次将组拆分吗?
(我正在使用MySQL)
答案 0 :(得分:1)
一种方法是使用rand()
,但在FROM
子句中的子查询中:
SELECT *
FROM Songs s JOIN
(SELECT songwriter, rand() as rnd
FROM (SELECT DISTINCT songwriter FROM s) s
) ss
ON ss.songwriter = s.songwriter
ORDER BY ss.rnd, ss.songwriter ASC;
您还可以对值进行哈希处理,但我认为MySQL中没有现成的可用简单哈希函数。