Php 使用的自然排序;仅MySQL
我需要你的帮助. 我们是为客户开发一个电子商务项目 现在我们需要使用MySQL中的自然排序对产品进行排序。 (我们不能这样做 用PHP实现数组排序 利用纳索特,因为我们使用的是延迟加载,所以只能对MySQL中的数据进行排序) 需要类似以下示例的解决方案(但来自MySQL) 。natsort.php 为了更清楚:这是我想要排序的原始数据 INSERT INTO `sample` (`id`, `data`) VALUES (1, 'MLB-1.0-6.0-2.5'), (2, 'MLB-1.0-6.0-3'), (3, 'MLB-1.0-7.0-2'), (4, 'MLB-1.0-7.0-2.5'), (5, 'MLB-1.0-7.0-3'), (6, 'MLB-1.0-9.0-2.5'), (7, 'MLB-1.0-10.0-2'), (8, 'MLB-1.0-10.0-2.5'), (9, 'MLB-1.0-8.0-3'), (10, 'MLB-1.0-9.0-2.5'), (11, 'MLB-1.0-10.0-2'), (12, 'MLB-1.0-10.0-2.5'), (13, 'MLB-1.0-10.0-3'), (14, 'MLB-1.0-12.0-2.5'), (15, 'MLB-1.0-12.0-3'), (16, 'MLB-1.2-10.0-2'), (17, 'MLB-1.2-10.0-3'), (18, 'MLB-1.2-10.0-4'), (19, 'MLB-1.2-10.0-5'), (20, 'MLB-1.2-11.2-2'), (21, 'MLB-1.2-11.2-3'), (22, 'MLB-1.2-11.2-4'), (23, 'MLB-1.2-12.0-2'), (24, 'MLB-1.2-12.0-2.5'), (25, 'MLB-1.2-12.0-3'), (26, 'MLB-1.2-12.0-4'), (27, 'MLB-1.2-12.0-5'), (28, 'MLB-1.2-12.0-6'), (29, 'MLB-1.2-12.0-8'), (30, 'MLB-1.2-12.7-3'), (31, 'MLB-1.2-14.0-2.5'), (32, 'MLB-1.2-14.0-3'), (33, 'MLB-1.2-4.0-2.5'), (34, 'MLB-1.2-4.0-3'), (35, 'MLB-1.2-5.0-2'), (36, 'MLB-1.2-5.0-2.5'), (37, 'MLB-1.2-5.0-3'), (38, 'MLB-1.2-6.0-2'), (39, 'MLB-1.2-6.0-2.5'), (40, 'MLB-1.2-14.0-4'), (41, 'MLB-1.2-14.0-5'), (42, 'MLB-1.2-16.0-3'), (43, 'MLB-1.2-16.0-4'), (44, 'MLB-1.2-16.0-5'), (45, 'MLB-1.2-19.0-3'), (46, 'MLB-1.2-19.0-4'), (47, 'MLB-1.2-22.0-3'), (48, 'MLB-1.2-22.0-4'), (49, 'MLB-1.2-6.0-3'), (50, 'MLB-1.2-6.0-4'), (51, 'MLB-1.2-6.0-5'), (52, 'MLB-1.2-6.0-6'), (53, 'MLB-1.2-7.0-2'), (54, 'MLB-1.2-7.0-2.5'), (55, 'MLB-1.2-7.0-3'), (56, 'MLB-1.2-7.0-4'), (57, 'MLB-1.2-8.0-2'), (58, 'MLB-1.2-8.0-2.5'), (59, 'MLB-1.2-8.0-2/2.5B'), (60, 'MLB-1.2-8.0-3'), (61, 'MLB-1.2-8.0-4'), (62, 'MLB-1.2-8.0-5'), (63, 'MLB-1.2-8.0-6'), (64, 'MLB-1.2-8.0-8'), (65, 'MLB-1.2-9.0-2'), (66, 'MLB-1.2-9.0-2.5'), (67, 'MLB-1.2-9.0-3'), (68, 'MLB-1.2-9.0-4'); 插入到'sample'('id','data`)值中 (1,“MLB-1.0-6.0-2.5”), (2,“MLB-1.0-6.0-3”), (3,“MLB-1.0-7.0-2”), (4,“MLB-1.0-7.0-2.5”), (5,“MLB-1.0-7.0-3”), (6,“MLB-1.0-9.0-2.5”), (7,“MLB-1.0-10.0-2”), (8,'MLB-1.0-10.0-2.5'), (9,“MLB-1.0-8.0-3”), (10,'MLB-1.0-9.0-2.5'), (11,“MLB-1.0-10.0-2”), (12,'MLB-1.0-10.0-2.5'), (13,“MLB-1.0-10.0-3”), (14,“MLB-1.0-12.0-2.5”), (15,“MLB-1.0-12.0-3”), (16,“MLB-1.2-10.0-2”), (17,“MLB-1.2-10.0-3”), (18,“MLB-1.2-10.0-4”), (19,“MLB-1.2-10.0-5”), (20,“MLB-1.2-11.2-2”), (21,“MLB-1.2-11.2-3”), (22,“MLB-1.2-11.2-4”), (23,“MLB-1.2-12.0-2”), (24,“MLB-1.2-12.0-2.5”), (25,“MLB-1.2-12.0-3”), (26,“MLB-1.2-12.0-4”), (27,“MLB-1.2-12.0-5”), (28,“MLB-1.2-12.0-6”), (29,“MLB-1.2-12.0-8”), (30,“MLB-1.2-12.7-3”), (31,“MLB-1.2-14.0-2.5”), (32,“MLB-1.2-14.0-3”), (33,“MLB-1.2-4.0-2.5”), (34,“MLB-1.2-4.0-3”), (35,“MLB-1.2-5.0-2”), (36,“MLB-1.2-5.0-2.5”), (37,“MLB-1.2-5.0-3”), (38,“MLB-1.2-6.0-2”), (39,“MLB-1.2-6.0-2.5”), (40,“MLB-1.2-14.0-4”), (41,“MLB-1.2-14.0-5”), (42,“MLB-1.2-16.0-3”), (43,“MLB-1.2-16.0-4”), (44,“MLB-1.2-16.0-5”), (45,'MLB-1.2-19.0-3'), (46,“MLB-1.2-19.0-4”), (47,“MLB-1.2-22.0-3”), (48,“MLB-1.2-22.0-4”), (49,“MLB-1.2-6.0-3”), (50,“MLB-1.2-6.0-4”), (51,“MLB-1.2-6.0-5”), (52,“MLB-1.2-6.0-6”), (53,“MLB-1.2-7.0-2”), (54,“MLB-1.2-7.0-2.5”), (55,“MLB-1.2-7.0-3”), (56,“MLB-1.2-7.0-4”), (57,“MLB-1.2-8.0-2”), (58,“MLB-1.2-8.0-2.5”), (59,“MLB-1.2-8.0-2/2.5B”), (60,'MLB-1.2-8.0-3'), (61,“MLB-1.2-8.0-4”), (62,“MLB-1.2-8.0-5”), (63,“MLB-1.2-8.0-6”), (64,“MLB-1.2-8.0-8”), (65,“MLB-1.2-9.0-2”), (66,“MLB-1.2-9.0-2.5”), (67,“MLB-1.2-9.0-3”), (68,“MLB-1.2-9.0-4”); 这是我排序后的预期结果: MLB-1.0-6.0-2.5 MLB-1.0-6.0-3 MLB-1.0-7.0-2 MLB-1.0-7.0-2.5 MLB-1.0-7.0-3 MLB-1.0-8.0-2 MLB-1.0-8.0-2.5 MLB-1.0-8.0-3 MLB-1.0-9.0-2.5 MLB-1.0-10.0-2 MLB-1.0-10.0-2.5 MLB-1.0-10.0-3 MLB-1.0-12.0-2.5 MLB-1.0-12.0-3 MLB-1.2-4.0-2.5 MLB-1.2-4.0-3 MLB-1.2-5.0-2 MLB-1.2-5.0-2.5 MLB-1.2-5.0-3 MLB-1.2-6.0-2 MLB-1.2-6.0-2.5 MLB-1.2-6.0-3 MLB-1.2-6.0-4 MLB-1.2-6.0-5 MLB-1.2-6.0-6 MLB-1.2-7.0-2 MLB-1.2-7.0-2.5 MLB-1.2-7.0-3 MLB-1.2-7.0-4 MLB-1.2-8.0-2 MLB-1.2-8.0-2.5 MLB-1.2-8.0-2/2.5B MLB-1.2-8.0-3 MLB-1.2-8.0-4 MLB-1.2-8.0-5 MLB-1.2-8.0-6 MLB-1.2-8.0-8 MLB-1.2-9.0-2 MLB-1.2-9.0-2.5 MLB-1.2-9.0-3 MLB-1.2-9.0-4 MLB-1.2-10.0-2 MLB-1.2-10.0-2.5 MLB-1.2-10.0-3 MLB-1.2-10.0-4 MLB-1.2-10.0-5 MLB-1.2-11.2-2 MLB-1.2-11.2-3 MLB-1.2-11.2-4 MLB-1.2-12.0-2 MLB-1.2-12.0-2.5 MLB-1.2-12.0-3 MLB-1.2-12.0-4 MLB-1.2-12.0-5 MLB-1.2-12.0-6 MLB-1.2-12.0-8 MLB-1.2-12.7-3 MLB-1.2-14.0-2.5 MLB-1.2-14.0-3 MLB-1.2-14.0-4 MLB-1.2-14.0-5 MLB-1.2-16.0-3 MLB-1.2-16.0-4 MLB-1.2-16.0-5 MLB-1.2-19.0-3 MLB-1.2-19.0-4 MLB-1.2-22.0-3 MLB-1.2-22.0-4 MLB-1.0-6.0-2.5 MLB-1.0-6.0-3 MLB-1.0-7.0-2 MLB-1.0-7.0-2.5 MLB-1.0-7.0-3 MLB-1.0-8.0-2 MLB-1.0-8.0-2.5 MLB-1.0-8.0-3 MLB-1.0-9.0-2.5 MLB-1.0-10.0-2 MLB-1.0-10.0-2.5 MLB-1.0-10.0-3 MLB-1.0-12.0-2.5 MLB-1.0-12.0-3 MLB-1.2-4.0-2.5 MLB-1.2-4.0-3 MLB-1.2-5.0-2 MLB-1.2-5.0-2.5 MLB-1.2-5.0-3 MLB-1.2-6.0-2 MLB-1.2-6.0-2.5 MLB-1.2-6.0-3 MLB-1.2-6.0-4 MLB-1.2-6.0-5 MLB-1.2-6.0-6 MLB-1.2-7.0-2 MLB-1.2-7.0-2.5 MLB-1.2-7.0-3 MLB-1.2-7.0-4 MLB-1.2-8.0-2 MLB-1.2-8.0-2.5 MLB-1.2-8.0-2/2.5B MLB-1.2-8.0-3 MLB-1.2-8.0-4 MLB-1.2-8.0-5 MLB-1.2-8.0-6 MLB-1.2-8.0-8 MLB-1.2-9.0-2 MLB-1.2-9.0-2.5 MLB-1.2-9.0-3 MLB-1.2-9.0-4 MLB-1.2-10.0-2 MLB-1.2-10.0-2.5 MLB-1.2-10.0-3 MLB-1.2-10.0-4 MLB-1.2-10.0-5 MLB-1.2-11.2-2 MLB-1.2-11.2-3 MLB-1.2-11.2-4 MLB-1.2-12.0-2 MLB-1.2-12.0-2.5 MLB-1.2-12.0-3 MLB-1.2-12.0-4 MLB-1.2-12.0-5 MLB-1.2-12.0-6 MLB-1.2-12.0-8 MLB-1.2-12.7-3 MLB-1.2-14.0-2.5 MLB-1.2-14.0-3 MLB-1.2-14.0-4 MLB-1.2-14.0-5 MLB-1.2-16.0-3 MLB-1.2-16.0-4 MLB-1.2-16.0-5 MLB-1.2-19.0-3 MLB-1.2-19.0-4 MLB-1.2-22.0-3 MLB-1.2-22.0-4 下面的解决方案已尝试:Php 使用的自然排序;仅MySQL,php,mysql,Php,Mysql,我需要你的帮助. 我们是为客户开发一个电子商务项目 现在我们需要使用MySQL中的自然排序对产品进行排序。 (我们不能这样做 用PHP实现数组排序 利用纳索特,因为我们使用的是延迟加载,所以只能对MySQL中的数据进行排序) 需要类似以下示例的解决方案(但来自MySQL) 。natsort.php 为了更清楚:这是我想要排序的原始数据 INSERT INTO `sample` (`id`, `data`) VALUES (1, 'MLB-1.0-6.0-2.
请建议使用MySQL解决此问题。根据您发布的数据,我认为这将有助于:
SELECT *
FROM sample
ORDER BY CAST(SUBSTRING(SUBSTRING_INDEX(`data`, '-', 2), 5) AS double),
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, '-', 3), '-', -1) AS double),
SUBSTRING_INDEX(`data`, '-', -1);
查询所做的是使用'-'
作为分隔符拆分数据列,并提取数字部分,即从''MLB-1.2-4.0-2.5'
提取1.2
,4.0
和2.5
,将它们转换为双精度(最后一个块除外)并根据它们对数据进行排序。基于此,并假设data
列将采用您发布的格式(一个以3个破折号作为分隔符的字符串)
为好人提供db模式和预期结果。我们需要类似于此示例的解决方案,但需要MySQL。natsort.php
select *,SUBSTRING_INDEX(SUBSTRING_INDEX(data,"-",3),"-",-1) as mystring from sample ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(data,"-",2),"-",-1)+0, SUBSTRING_INDEX(SUBSTRING_INDEX(data,"-",3),"-",-1)+0, SUBSTRING_INDEX(data,"-",-1);