【问题标题】:MySQL: sort list of values before use it in the queryMySQL:在查询中使用之前对值列表进行排序
【发布时间】:2016-01-22 14:13:05
【问题描述】:

我可以在查询中使用值列表之前对其进行排序吗?

点赞SELECT SORTINGFN(2,3,1) 并获得1,2,3SELECT 2,3,1 ORDER BY ??? ASC 之类的东西,但按什么排序?

我需要确保参数的顺序始终相同,以便从 MD5('1,2,3')MD5('2,3,1') 获得相同的哈希

【问题讨论】:

    标签: mysql sql md5


    【解决方案1】:

    无表(为argx设置值):

    SELECT arg1,arg2,arg3,
       MD5(SELECT GROUP_CONCAT(col ORDER BY col) 
           FROM (SELECT arg1 AS col
                 UNION ALL SELECT arg2 
                 UNION ALL SELECT arg3) AS sub) AS md5_checksum
    

    SqlFiddleDemo

    输出:

    ╔════╦════╦════╦══════════════════════════════════╗
    ║ 1  ║ 2  ║ 3  ║           md5_checksum           ║
    ╠════╬════╬════╬══════════════════════════════════╣
    ║ 1  ║ 2  ║ 3  ║ 55b84a9d317184fe61224bfb4a060fb0 ║
    ║ 3  ║ 2  ║ 1  ║ 55b84a9d317184fe61224bfb4a060fb0 ║
    ║ 3  ║ 1  ║ 2  ║ 55b84a9d317184fe61224bfb4a060fb0 ║
    ╚════╩════╩════╩══════════════════════════════════╝
    

    反正MD5是弱哈希算法。


    SQL 可以做很多事情。问题是这种操作的好地方,什么时候可以在应用层做。

    任意列表:

    SELECT MD5(GROUP_CONCAT(val ORDER BY val)) AS md5_sum
    FROM (
      SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.results, ',', n.n), ',', -1) AS val
      FROM (SELECT '3,2,1,10,212,3123,1' AS results) AS t 
      CROSS JOIN 
      (
         SELECT a.N + b.N * 10 + 1 n
           FROM 
          (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
         ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
      ) n
      WHERE n.n <= 1 + (LENGTH(t.results) - LENGTH(REPLACE(t.results, ',', '')))
    ) sub
    

    SqlFiddleDemo2

    输出:

    ╔══════════════════════╦══════════════════════════════════╗
    ║        args          ║             md5_sum              ║
    ╠══════════════════════╬══════════════════════════════════╣
    ║ 3,2,1,10,212,3123,1  ║ e2003296ed64cb59be61558275e22433 ║
    ║ 212,3123,1,3,2,1,10  ║ e2003296ed64cb59be61558275e22433 ║
    ╚══════════════════════╩══════════════════════════════════╝
    

    【讨论】:

    • 我需要使用 MySQL 对来自应用程序的 ID 进行排序。没有具有该 ID 的表,它们只是参数。是的,我可以在应用程序中对它们进行排序,但也许可以使用 MySQL,只是出于好奇。
    • 有趣的想法,但是 ID 列表的长度是任意的
    • @Kanstantsin 问题出在哪里?只需添加更多参数(SELECT arg1 AS col UNION ALL SELECT arg2 UNION ALL SELECT arg3 UNION ALL ...)
    • 问题在于,使用这种方法,使用脚本语言对参数进行排序确实更容易
    • @Kanstantsin 就这样吧:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2020-02-27
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多