这会给你你想要的:
set @prev := '', @i := 0;
select make, id, title, year
from (select id, title, make, year, (@i := if(@prev = make, @i + 1, 0)) as idx, (@prev := make)
from (select id, title, make, year from cars order by make, id) ordered) indexed
where idx < 10
改变选择which获取10行,改变最里面查询的order by;我选择了idorder by make, id
,但你可以选择年份。只要make
首先它会起作用。您可以放弃其他任何内容以进行“随机”选择。
根据您的意愿订购最终结果。
这是如何运作的:
- 最里面的查询只是对准备好编号的行进行排序 - 别名为
ordered
- 下一个包装器查询计算行号(
@i
- 在 make 组内从零开始计数 - 别名为indexed
. @prev
保存前一行的品牌
- 外部查询从以下位置选择数据
indexed
其中行号小于 10
这是测试代码,边缘情况为 1 辆宝马、3 辆通用汽车和 13 辆福特:
create table cars (id int not null primary key auto_increment, title text, make text, year text);
insert into cars (title, make, year) values
('f1', 'ford', 2000), ('f2', 'ford', 2001), ('f3', 'ford', 2002), ('f4', 'ford', 2003),
('f5', 'ford', 2004), ('f6', 'ford', 2005), ('f7', 'ford', 2006), ('f8', 'ford', 2007),
('f9', 'ford', 2008), ('f10', 'ford', 2009), ('f11', 'ford', 2010), ('f12', 'ford', 2011),
('f13', 'ford', 2012), ('g1', 'gmc', 2000), ('g2', 'gmc', 2001), ('g3', 'gmc', 2002),
('b1', 'bmw', 2002);
上述查询的输出:
+------+----+-------+------+
| make | id | title | year |
+------+----+-------+------+
| bmw | 17 | b1 | 2002 |
| ford | 1 | f1 | 2000 |
| ford | 2 | f2 | 2001 |
| ford | 3 | f3 | 2002 |
| ford | 4 | f4 | 2003 |
| ford | 5 | f5 | 2004 |
| ford | 6 | f6 | 2005 |
| ford | 7 | f7 | 2006 |
| ford | 8 | f8 | 2007 |
| ford | 9 | f9 | 2008 |
| ford | 10 | f10 | 2009 |
| gmc | 14 | g1 | 2000 |
| gmc | 15 | g2 | 2001 |
| gmc | 16 | g3 | 2002 |
+------+----+-------+------+