刚问了一个与这个问题很相似的问题......
目前我在声明中正在做一个非常基本的OrderBy。
SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
这个问题是'position'的空字符串条目被视为0.因此,位置为空字符串的所有条目都显示在1,2,3,4之前。例如:
'', '', '', 1, 2, 3, 4
或:
0, 0, 0, 1, 2, 3, 4
有没有办法实现以下排序:
1, 2, 3, 4, '', '', ''.
或:
1, 2, 3, 4, 0, 0, 0.
我认为解决方案可能具有某种替换功能,但我无法找到能够完成我所追求的功能。
答案 0 :(得分:15)
SELECT *
FROM tablename
WHERE visible=1
ORDER BY
case when position in('', '0') then 1 else 0 end,
position ASC,
id DESC
答案 1 :(得分:1)
您可以尝试CASE statement,如下所示:
SELECT *
FROM tablename
WHERE visible = 1
ORDER BY CASE position WHEN '' THEN '9999' ELSE position END CASE ASC,
ID DESC
答案 2 :(得分:1)
你说position
包含空字符串条目......你的意思是空字符串,还是指NULL
?如果它实际上包含NULL
个条目,你应该稍微修改一下Orbman的声明:
SELECT *
FROM tablename
WHERE visible=1
ORDER BY
COALESCE(position, ~0)
, id DESC
COALESCE()
返回第一个参数NOT NULL
的值。 〜0是一段黑魔法,可以获得MySQL支持的最大整数值。 (〜做一个按位否定,将所有0位变为1)。因此,在这种情况下,如果position IS NULL
为真,则返回18446744073709551615
,否则返回position
的值。
我还想指出,position
列的数据类型最有可能是某种整数类型(请参阅http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html)。因为你提到空字符串,我认为你应该通过SHOW CREATE TABLE <tablename>
检查你的表定义。如果position不是整数类型,我建议你改变它。主要原因是字符串,即使它们看起来像数字,也不会被排序为数字。
答案 3 :(得分:0)
您可以尝试加入两个子查询,其中一个选择ID&gt; 0并且不为空,另一个选择为空,仅为0