<p>Das Folgende ist das einfachste mögliche Beispiel, aber jede Lösung sollte sich auf die erforderlichen n Top-Ergebnisse skalieren lassen: </p>
<p>Wie erhalten Sie anhand der folgenden Tabelle, die Spalten für Personen, Gruppen und Alter enthält, die beiden ältesten Personen in jeder Gruppe? (Gleichstände innerhalb einer Gruppe sollten nicht zu mehr Ergebnissen führen, sondern stattdessen die Top 2 in alphabetischer Reihenfolge ergeben) </p>
<vor>
+--------+-------+-----+
|. Person |. Gruppe |
+--------+-------+-----+
|. Bob |. 1 |
|Jill|1|34|
|. Shawn |. 1 |
|. Jake |. 29 |
|. Paul |. 2 |
|. Laura |. 2 |
+--------+-------+-----+
</pre>
<p>Gewünschter Ergebnissatz: </p>
<vor>
+--------+-------+-----+
|. Shawn |. 1 |
|Jill|1|34|
|. Laura |. 2 |
|. Paul |. 2 |
+--------+-------+-----+
</pre>
<hr>
Ich habe eine gute MySQL-spezifische Antwort von @Bohemian erhalten: </p>
<pre class="brush:php;toolbar:false;">select *
from (select * from mytable order by `Group`, Age desc, Person) x
gruppieren nach „Gruppe“</pre>
<p>Es wäre schön, darauf aufbauen zu können, aber ich weiß nicht, wie. </p>
在其他数据库中,您可以使用
ROW_NUMBER
来实现此功能。MySQL不支持ROW_NUMBER
,但您可以使用变量来模拟它:在线演示: sqlfiddle
编辑 我刚刚注意到bluefeet发布了一个非常相似的答案:给他+1。但是这个答案有两个小优点:
因此,我将保留它,以防它能帮助到某人。
以下是一种方法,使用
UNION ALL
(请参见带有演示的SQL Fiddle)。这适用于两个组,如果你有多个组,则需要指定group
编号并为每个group
添加查询:有多种方法可以实现这个目标,请参考本文以确定适合您情况的最佳方法:
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
编辑:
这也可能适用于您,它为每条记录生成一个行号。使用上面链接中的示例,它将仅返回行号小于或等于2的记录:
请参见演示