MySQL中的列排序

MySQL中的列排序,mysql,Mysql,我有一张表,products,其尺寸如下: +------------+--------+-------+--------+ | product_id | length | width | height | +------------+--------+-------+--------+ | 1 | 23.00 | 25.00 | 22.00 | | 2 | 14.25 | 14.25 | 1.75 | | 3 | 19.50 |

我有一张表,
products
,其尺寸如下:

+------------+--------+-------+--------+
| product_id | length | width | height |
+------------+--------+-------+--------+
|          1 |  23.00 | 25.00 |  22.00 |
|          2 |  14.25 | 14.25 |   1.75 |
|          3 |  19.50 |  3.00 |   2.50 |
|          4 |   3.50 | 11.00 |  19.00 |
+------------+--------+-------+--------+
我需要做的是将它们按顺序排列,
length
始终是最大的维度,
width
是第二大维度,
height
是最小维度。这很容易做到:

SELECT
    GREATEST(length,width,height) AS length,
    LEAST(length,width,height) AS height
FROM products
但是我怎样才能知道最后的维度呢?然后我试了一下:

SELECT product_id,
    SUBSTRING_INDEX(GROUP_CONCAT(dim ORDER BY dim DESC), ',', 1) AS length,
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(dim ORDER BY dim DESC), ',', 2), ',', -1) AS width,
    SUBSTRING_INDEX(GROUP_CONCAT(dim ORDER BY dim DESC), ',', -1) AS height 
FROM
(
    SELECT product_id, length AS dim
    FROM products
    UNION
    SELECT product_id, width AS dim
    FROM products
    UNION
    SELECT product_id, height AS dim
    FROM products
) v
GROUP BY product_id;

这实际上是可行的,但似乎复杂得离谱。有谁能推荐一个比我上面概述的更简单的解决方案吗?

一些简单的数学就可以了,因为只有3列:

SELECT length + width + height 
     - GREATEST(length, width, height) 
     - LEAST(length, width, height) AS width
FROM products

对于多于一组固定的列,基本上是先取消驱动,然后再旋转。有些数据库有一个非标准的扩展,比如T-SQL中的UNPIVOT/PIVOT,但我不认为MySQL中有一个容易做到的扩展,它最终看起来不像您的查询,或者使用
listag

的道德等价物,只要有3列,一些简单的数学就可以做到:

SELECT length + width + height 
     - GREATEST(length, width, height) 
     - LEAST(length, width, height) AS width
FROM products

对于多于一组固定的列,基本上是先取消驱动,然后再旋转。有些数据库有一个非标准的扩展,比如T-SQL中的UNPIVOT/PIVOT,但我不认为MySQL中有一个很容易做到的扩展,它最终看起来不像您的查询,或者使用
listag

实际上是一个道德上等价的扩展,我想这就是我应该怎么做的。哈哈——这看起来很简单,在大多数其他语言中,你只需要对数组进行排序——但是在sql中,我有点困惑于如何雄辩地解决这个问题。我在这里所做的事情感觉真的很简单,使用find_in_set()而不是SUBSTRING_INDEX(),这更容易处理,特别是当您有3个以上的列要排序时。@Shadow-您能举个例子说明如何将
find_in_set()
group_concat()
或与我上面的查询一起使用吗?实际上,我在尝试时遇到了一个错误,我想我就是这样做的。哈哈——这看起来很简单,在大多数其他语言中,你只需要对数组排序——但在sql中,我有点困惑于如何雄辩地解决这个问题。我在这里所做的事情感觉真的很简单,使用find_in_set()而不是SUBSTRING_INDEX(),这更容易处理,特别是当您有3个以上的列要排序时。@Shadow-您能举个例子说明如何将
find_in_set()
group_concat()
或与我上面的查询一起使用吗?我只是在尝试时遇到了一个错误好主意:-)我对一个同样适用于4列或更多列的排序解决方案感兴趣,但这确实比我做的更好地解决了这个问题。谢谢这是一个更复杂的答案,因为你基本上想要做旋转操作,这在MySQLgood idea中并不容易:-)我对一个同样适用于4列或更多列的排序解决方案感兴趣,但这确实比我做的更好地解决了这个问题。谢谢,这是一个更复杂的答案,因为您基本上希望执行数据透视操作,而这在MySQL中并不容易