Iva*_*var 6 mysql random select group-by
我在MySQL中有一个包含列名的表category.我正在尝试编写一个查询,从每个记录返回2个随机记录category.
这是我用来从category我的rating列中获取每个具有最高值的2条记录的代码:
SELECT e1.*
FROM entries AS e1
WHERE (SELECT Count(*)
FROM entries AS e2
WHERE e2.category = e1.category
AND e1.rating <= e2.rating) <= 2
ORDER BY category,
rating DESC
Run Code Online (Sandbox Code Playgroud)
查看此链接,查看包含一些示例数据的表格以及上述查询:http: //sqlfiddle.com/#!9/bab8e/1
我通过按类别列和随机数对表进行排序,达到了您想要的结果。然后,我为每一行分配一个递增的数字,每次类别更改时,该数字都从 1 开始。然后,我仅返回 rowNum 小于或等于 2 的结果。如果您想返回 3 个随机行,只需将其更改为小于或等于 3,依此类推。
SELECT entry_id,
category,
rating
FROM (SELECT @currank := IF(@category = category, @currank + 1, 1) AS rowNum,
@category := category AS categoryVar,
e1.*
FROM (SELECT *,
(SELECT @currank := 0) r
FROM entries
ORDER BY category,
Rand()) AS e1)AS e2
WHERE rownum <= 2
ORDER BY category,
rating;
Run Code Online (Sandbox Code Playgroud)
这是一个 sqlfiddle 链接,就像您在问题中发布的链接一样: http://sqlfiddle.com/#!9/ bab8e/37/0
请注意,可以轻松调整同一查询以返回一组非随机的记录。例如,如果您想返回rating每个列表中的前 5 个category,您可以更改
ORDER BY category,rand()
到
ORDER BY category, rating DESC
和改变
WHERE rownum <= 2
到
WHERE rownum <= 5
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |