3

我正在使用 mysql db 的排序语法,我想通过完成列对行进行排序。我希望示例将描述该问题:

id |t1 | t2 | t3 | t4
----------------------
 1 | a |  b |  c | d
 2 |   |  e |    |
 3 | f |  g |    |
 4 | h |  i | j  |

这是我的行/列结构。如您所见,有些字段是空的。我想对表格进行排序,以便输入看起来像这样

id |t1 | t2 | t3 | t4
----------------------
 1 | a |  b |  c | d
 4 | h |  i | j  |
 3 | f |  g |    |
 2 |   |  e |    |

它已按填充(非空)字段的数量排序。最简单的方法是使用这样的查询进行排序:

SELECT id, t1, t2, t3, t4 FROM table ORDER BY t1 DESC, t2 DESC, t3 DESC, t4 DESC

它在大多数情况下都很好用,但是如果我的表如下所示,看看会发生什么:

id |t1 | t2 | t3 | t4
----------------------
 1 |   |  b |  c | d
 2 |   |  z |    |

排序后:

id |t1 | t2 | t3 | t4
----------------------
 2 |   |  z |    |
 1 |   |  b |  c | d

为什么?因为排序顺序是降序的,并且 t1 列是空的(所以它被忽略了),下一列是 t2。它也按降序排序,忽略其余列(如果它们为空)。

我发现在这里解决了类似的问题(我猜 - 尚未检查) ,但解决方案看起来很讨厌。您是否有其他想法按非空列数对表进行排序?

4

2 回答 2

3

您实际上需要为每条记录创建一个分数并对其进行排序。我建议测试每个字段是否为“空”并取总和,然后按升序排序(以便最低分数,即具有最少空字段的记录排在第一位)。

您可以滥用 MySQL 缺乏真正的布尔类型来创建这样的分数,如下所示:

ORDER BY (t1 IS NULL) + (t2 IS NULL) + (t3 IS NULL) + (t4 IS NULL)

或者,如果您的“空”字段实际上是空字符串''而不是NULL

ORDER BY (t1 = '') + (t2 = '') + (t3 = '') + (t4 = '')
于 2013-01-14T14:57:15.430 回答
3

您应该对所有相关列的结果IS NULLIS NOT NULL所有相关列的结果求和,并将其用作主要排序来解决您的基本问题,然后施加您想要的任何次要排序。

我不清楚你想如何对具有相同数量的非空列值的两行进行排序,但我猜你想对它们进行从左到右的升序排序,在这种情况下这应该适合你:

(更新:正如 eggyal 所指出的,“空”是指空字符串,而不是 NULL。请参阅下面的更新查询):

SELECT id, t1, t2, t3, t4 
FROM table 
ORDER BY ((t1 = '') + (t2 = '') + (t3 = '') + (t4 = '')) ASC, 
t1 DESC, t2 DESC, t3 DESC, t4 DESC
于 2013-01-14T15:02:32.170 回答