如何在MYSQL中对列进行排序

3

我有每一行中的三个字段,我想将它们连接起来并按升序排序:

select * concat(field1, field2, field3) AS result
from tbl 

我的数据是:

field1, field2, field3
   7       2       9
   4       7       8
   6       3       2 

期望的结果是:
field1, field2, field3   result
  7       2       9       279
  4       7       8       478
  6       3       2       236

我该怎么做呢?

你的字段数量总是一样的吗? - amd
@amd 不,它们是不同的,而且它们的数值可能会随时更改。我想将它们从小到大连接起来。 - mohammad zahedi
你的字段中只包含单个数字吗? - kiran Biradar
@amd 是的,只需要数字。 - mohammad zahedi
6个回答

5

技术上使用 LEASTGREATEST 函数

   SELECT field1, field2, field3,
   concat(LEAST(field1,field2,field3), 
   (field1 + field2 + field3) - (GREATEST(field1,field2,field3)+
   LEAST(field1,field2,field3)),
   GREATEST(field1,field2,field3)
   ) 
   from tbl

@mohammad zahedi这有帮助吗? - Zaynul Abadin Tuhin

3
你可以尝试使用GROUP_CONCAT方法。它可以扩展到任意数量的列:
CREATE TABLE testdata(id INT PRIMARY KEY, field1 INT, field2 INT, field3 INT);
INSERT INTO testdata (id, field1, field2, field3) VALUES
(1, 7, 2, 9),
(2, 4, 7, 8),
(3, 6, 3, 2);

SELECT testdata.id, field1, field2, field3, GROUP_CONCAT(rtc.fields ORDER BY fields SEPARATOR '') AS fields_sorted
FROM testdata
INNER JOIN (
    SELECT id, field1 AS fields FROM testdata UNION ALL
    SELECT id, field2 AS fields FROM testdata UNION ALL
    SELECT id, field3 AS fields FROM testdata
) AS rtc ON testdata.id = rtc.id
GROUP BY testdata.id, field1, field2, field3;

输出:

+----+--------+--------+--------+---------------+
| id | field1 | field2 | field3 | fields_sorted |
+----+--------+--------+--------+---------------+
|  1 |      7 |      2 |      9 | 279           |
|  2 |      4 |      7 |      8 | 478           |
|  3 |      6 |      3 |      2 | 236           |
+----+--------+--------+--------+---------------+

1
一种更优雅的解决方案是利用本地的json_extract函数,按照键的顺序提取值并以升序排列。
select json_extract('{"10":10, "5": 5}', '$.*'); // [5, 10]
  1. 使用json_object函数构建JSON对象,并将同一字段用作键和值

  2. 使用json_extract提取所需顺序中的值

  3. 用空格替换[,]

select json_extract( json_object(f1, f1, f2, f2, f3, f3), '$.*' )

假设f1 = 5,f2 = 4和f3 = 1,则得到[1,4,5] 现在,您可以使用替换字符替换不需要的字符。
select replace( replace( replace( json_extract( json_object(f1, f1, f2, f2, f3, f3), '$.*' ), '[', ''), ']', ''), ', ', '') from t;

1

请尝试这个解决方案,虽然我没有测试过。稍微调整一下就可以实现您想要的效果。如果有任何改进,请在评论中提出。

select id, concat(MIN_VAL, MIDDLE_VAL, MAX_VAL) 
from
   ( SELECT ID,
        (CASE
            WHEN field1 >= field2 AND field1 >= field3 THEN field1
            WHEN field2 >= field1 AND field2 >= field3 THEN field2 
            WHEN field3 >= field1 AND field3 >= field2 THEN field3
            ELSE  field1 END) MAX_VAL

    ,Case When field1 < field2 And field1 < field3 Then field1 
                When field2 < field1 And field2 < field3 Then field2 
                Else field3
                End As MIN_VAL
    ,Case When (field1 >= field2 And field1 <= field3) OR  (field1 <= field2 And field1 >= field3) Then field1 
                When (field2 >= field3 And field2 <= field1) OR (field2 <= field3 And field2 >= field1)Then field2
                 WHEN (field3 >= field1 AND field3 <= field2) OR  (field3 <= field1 AND field3 >= field2) THEN field3 
                Else field1
                End As MIDDLE_VAL

       From table
) int_pass

0
假设您想要将第四列作为字符串连接到字段2、字段1、字段3中的顺序字段。
尝试:
select * ,concat(field2,field1,field3) as "result" from tbl;

enter image description here


我不认为这是我的答案,因为数字的值总是会改变并且不同。 - mohammad zahedi

0

您可以使用MySQL的CONCAT函数,如下:

SELECT *, CONCAT(field1, field2, field3) AS result from tbl;

嗨,但我的问题不同,我想按从低到高的值对它们进行排序。 - mohammad zahedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接