2014-03-06 71 views
0

我有一個3列(id,名稱,代碼)和10行的表。某些行沒有代碼,因此列對於某些列是空的。 我想要完成的是選擇行code列不是空的第一次排序的最後一次插入後跟所有行code列空排序的最後一次插入。 我試圖UNION兩個命令的MySQL語句

(SELECT * from tablename WHERE code <> '' ORDER BY ID DESC) UNION 
(SELECT * from tablename WHERE code = '' ORDER BY ID DESC) 

在工會的工作,但該命令沒有。我已經在這裏閱讀了關於其他問題,發現添加ORDER BY就像我添加的將不起作用,我應該在最後添加它,但這不會幫助我完成我想要的操作,並將具有code的行與行混合,噸。

有沒有一種方法可以讓我所追求的成功?

+0

** With out代碼**表示空字符串(即代碼<>''爲true),而不是代碼列爲空。對? – AgRizzo

+0

是的,我不檢查null,我檢查是否爲空。對不起,我沒有意識到它會造成混亂,我將編輯 – Raluca

回答

2

我認爲你需要把你的排序邏輯ORDER BY子句中

SELECT id, name, code 
FROM tablename 
ORDER BY code = '', ID desc; 
+0

@Raluca - 這是一個[sqlfiddle](http://sqlfiddle.com/#!2/31719e/2)的人爲數據集,你可以看到 – AgRizzo

+0

我發佈的問題是一個簡化的版本,所以當我適應我有錯誤,但我修復了它,現在看來你的聲明的作品。我從來沒有見過這個,你可以用幾句話解釋它是如何工作的。謝謝 – Raluca

+0

'code ='''是一個可以評估爲0或1的布爾表達式。由於0在1之前排序(按升序排列),所以我讓你想要首先排序的等於false(它也可以'ORDER BY code <>''DESC,ID desc') – AgRizzo

0

試試這個:

SELECT * FROM 
(
(SELECT * from tablename WHERE code <> '' ORDER BY ID DESC) 
UNION 
(SELECT * from tablename WHERE code = '' ORDER BY ID DESC) 
)tab ORDER BY ID DESC; 

或者

SELECT * from tablename ORDER BY code DESC,ID DESC 

變化ASC/DESC按你想讓它顯示