【发布时间】:2016-01-04 00:44:54
【问题描述】:
想象一下在线调查中的两个问题:
- 你喜欢苹果吗?
存储在 mysql db 列“q1”中的结果为 1 表示是或 0 表示否
- 你喜欢橘子吗?
存储在 mysql db 列“q2”中的结果为 1 表示是或 0 表示否
想象以下 SELECT 语句:
SELECT SUM(q1) AS q1Sum, SUM(q2) AS q2Sum FROM myTable
假设 q1Sum=10 和 q2Sum=12。当前的 SELECT 语句将返回:
+-------+-------+
| q1Sum | q2Sum |
+-------+-------+
| 10 | 12 |
+-------+-------+
但是是否可以返回不同的列顺序,以便最大的 SUM 始终是返回的第一列而不更改 SELECT 语句中的列表顺序?
SELECT SUM(q1) AS q1Sum, SUM(q2) AS q2Sum FROM myTable << something else >>
+-------+-------+
| q2Sum | q1Sum |
+-------+-------+
| 12 | 10 |
+-------+-------+
如果 q1Sum 大于 q2Sum,则返回的列顺序将恢复为原始顺序。
我为什么要问这个问题?
- 我从与上述类似的调查中继承了一个包含多个列的大型表格,其中对多个问题的回答是是=1 和否=0。我认为正确的方法是创建保存 SUM 值的变量并将它们插入临时表行,然后选择/排序返回的行。但是,这并不能真正回答“是否可以对返回的列进行排序”的问题,我什至不确定我的假设是否正确,“正确的方法”......
- 虽然我知道如何对返回的结果进行排序而不考虑顺序(在我的情况下使用 php),但我很好奇是否有一种方法可以自动对 mysql 中返回的列进行排序,以便最高值始终是第一列对于返回的剩余列,剩余列中的 SUM-ed 结果会以数字形式递减。
- 好奇是否有一个优雅的答案。虽然使用 ORDER BY 很容易对 mysql 中返回的 ROWS 进行排序,但我还没有看到如何对多个 SUM-ed 的单个返回行的 COLS 进行排序的示例如上所述的值。想象一下上面的 10 个问题而不是 2 个问题。我假设这是不可能的,但希望有人能证明我错了……以一种很好的方式。
【问题讨论】:
-
“否”。 查询的形状(结果列)是固定的。 IMOHO 的“正确”解决方案是规范化数据(通过设计或先前的查询结果) - 使问题变成 行 - 在对其进行操作之前。当作为查询的一部分完成时,这也称为“UNPIVOT”;它不一定需要临时表。