MySQL:在查询中使用它之前对值列表进行排序

时间:2016-01-22 14:13:05

标签: mysql sql md5

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

SELECT SORTINGFN(2,3,1)并获得1,2,3? 像SELECT 2,3,1 ORDER BY ??? ASC这样的东西,但按什么排序?

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

获取相同的哈希值

1 个答案:

答案 0 :(得分: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 ║
╚══════════════════════╩══════════════════════════════════╝