您可以通过以下查询来完成这样的结果:
[您实际上可以在任何组之间轮换数据]
SELECT
t.item_type,
t.item_name
FROM
(
SELECT
item_type,
item_name,
IF(@prev = item_type , @rank := @rank + 1 , @rank := 0) rankNumber,
@prev := item_type
FROM itemstable , (SELECT @prev := NULL, @rank := 0) vars
ORDER BY item_type,item_name
) t
ORDER BY t.rankNumber,t.item_type;
SQL FIDDLE DEMO
使用模式测试数据:
(如果您无法访问 SQL FIDDLE)
DROP TABLE IF EXISTS `itemstable`;
CREATE TABLE `itemstable` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`item_type` varchar(10) CHARACTER SET utf8 NOT NULL,
`item_name` varchar(50) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`ID`)
);
INSERT INTO `itemstable` VALUES ('1', 'A', 'ITEM 1');
INSERT INTO `itemstable` VALUES ('2', 'A', 'ITEM 2');
INSERT INTO `itemstable` VALUES ('3', 'B', 'ITEM 1');
INSERT INTO `itemstable` VALUES ('4', 'B', 'ITEM 2');
INSERT INTO `itemstable` VALUES ('5', 'C', 'ITEM 1');
INSERT INTO `itemstable` VALUES ('6', 'C', 'ITEM 2');
INSERT INTO `itemstable` VALUES ('8', 'C', 'ITEM 3');
对此测试数据运行上述查询,您将得到如下输出:
item_type item_name
A ITEM 1
B ITEM 1
C ITEM 1
A ITEM 2
B ITEM 2
C ITEM 2
C ITEM 3
说明:
- 首先根据
ITEM_TYPE (A,B,C...)对数据进行排序,然后
再次根据 ITEM_NAME (ITEM1,ITEM2...) 对排序后的数据进行排序。
item_type item_name
A ITEM 1
A ITEM 2
B ITEM 1
B ITEM 2
C ITEM 1
C ITEM 2
C ITEM 3
- 使同一类型下的项目粘在一起并排序
他们之间的顺序。
- 现在假设您正在浏览这个 double 排序的数据。
- 如果您找到属于以前见过的 ITEM_TYPE 的项目,那么您
将为这个刚刚看到的项目分配一个递增的排名编号。
- 否则,(这意味着您刚刚看到一个属于新
ITEM_TYPE),您将分配一个为零的排名编号。