假设我有一张桌子歌曲(标题,词曲作者)。我想得到一个歌曲列表,其中同一个作曲家的歌曲出现在一个块中。所以我只是排序:
SELECT * FROM Songs ORDER BY songwriter ASC
但是现在如果不同的词曲作者不会总是出现在同一个顺序中会很好。我想要一个输出,其中歌曲作者不会总是这样订购
a,a,a,b,c,c,d,e,和e
还喜欢
b,c,c,a,a,和,和d
例如。我知道我可以使用
SELECT songwriter FROM Songs GROUP BY songwriter ORDER BY RAND()
然后在返回的顺序中为每个词曲作者形成一个查询,但我真的只想使用一个查询来获得一个结果表。
我到目前为止唯一的想法是通过哈希函数进行排序,每次执行查询时都会在随机基础上选择哈希函数。这会让同一个词曲作者在混合不同的值时相互出现。但它似乎也太复杂了,我不知道如何以一种很好的方式实现选择哈希。
是否有任何干净的方法只用一个结果表来完成任务?是否可以GROUP,然后在一个查询中再次拆分组?
(我正在使用MySQL)
一种方法是使用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中没有一个简单的哈希函数可供使用。