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中并不容易