复杂的ORDER BY MySQL中的两个备用列

时间:2017-08-23 16:04:18

标签: mysql

我需要订购从最新到最新的访问列表,可以使用表主键Id来完成。但现在我想将对第二个键定义的同一文档的访问权限分组。

所以如果有这个结果:

  • 199985 Clase Just Vet + Marzo Sol Supuestos 254 y 255 Parte ...
  • 199984 Clase Just Vet + Marzo Jurisdiccion Voluntaria(20 -...
  • 199983 Clase Just Vet + Marzo Sol Supuestos 254 y 255 Parte ...
  • 198911 Clase Just Vet + Marzo Repaso Contencioso Administra ...
  • 198910 Clase Just Vet + Marzo Repaso Contencioso Administra ...

我需要按此顺序显示:

  • 199985 Clase Just Vet + Marzo Sol Supuestos 254 y 255 Parte ...
  • 199983 Clase Just Vet + Marzo Sol Supuestos 254 y 255 Parte ...
  • 199984 Clase Just Vet + Marzo Jurisdiccion Voluntaria(20 -...
  • 198911 Clase Just Vet + Marzo Repaso Contencioso Administra ...
  • 198910 Clase Just Vet + Marzo Repaso Contencioso Administra ...

我需要按主要ID排序,然后按文件名分组......

谢谢大家

1 个答案:

答案 0 :(得分:0)

这是一个很好的问题;但它没有示例表或代码,因此我假设您的表结构如下:

CREATE TABLE `test` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) NOT NULL
)

INSERT INTO `test` (`id`, `name`) VALUES
(199985, 'Clase Just Vet+Marzo Sol Supuestos 254 y 255 Parte...'),
(199984, 'Clase Just Vet+Marzo Jurisdiccion Voluntaria (20-...'),
(199983, 'Clase Just Vet+Marzo Sol Supuestos 254 y 255 Parte...'),
(198911, 'Clase Just Vet+Marzo Repaso Contencioso Administra...'),
(198910, 'Clase Just Vet+Marzo Repaso Contencioso Administra...');

我发现请求的订单有点棘手,所以我想首先我们需要对ids进行排序&然后将其用作子查询,如下所示:

SELECT GROUP_CONCAT(id) ids FROM `test` GROUP BY `name` ORDER BY `id` DESC

给出了结果:

ids 
199985,199983   
199984  
198911,198910   

正如您可能知道的那样,您不能使用返回超过1行的子查询来执行任何有用的操作,因此我需要使用另一个group_concat来组合结果 为了实现这一点,我们需要添加另一个列来强制mysql在一个组中使用它,因为上面的结果与我们可以分组没有相似之处。

结果查询:

SELECT GROUP_CONCAT(`ids`) FROM( 
          SELECT GROUP_CONCAT(id) ids, 'x' as `useful_column` 
          FROM `test` GROUP BY `name` ORDER BY `id` DESC) `table`

正如预期的那样效果很好,我们得到了ID的组合结果如下:

199985,199983,199984,198911,198910  

这是您提问中提到的排序顺序;现在要实际获得您想要的排序结果,您只需将此结果与select结合,如下所示:

SELECT * FROM `test` ORDER BY FIND_IN_SET(`id`, 
(SELECT GROUP_CONCAT(`ids`) FROM( 
 SELECT GROUP_CONCAT(id) ids, 'x' as `useful_column` FROM `test` 
 GROUP BY `name` ORDER BY `id` DESC) `table`));

请记住,我只是经历过这个问题,因为我发现它很有趣&我想尝试解决它,所以这个解决方案可能不是最好的解决方案,因为group_concat和amp;我实际上并不确定find_in_set会有多快或者是否有任何其他限制