2014-03-04 44 views
0

我有兩個表格,類別和產品。我正在嘗試做一個select語句,將所有產品都關閉,並使用categories表中的order列來訂購它們。SQL按類別排列產品訂單在產品未鏈接到某個類別時不起作用

Categories 
+--------+-------+-------+ 
| cat_id | name | order | 
+--------+-------+-------+ 
| 1 | Cat 1 | 1 | 
| 2 | Cat 2 | 3 | 
| 3 | Cat 2 | 2 | 
+--------+-------+-------+ 

Products 
+---------+--------+-------+--------+ 
| prod_id | name | price | cat_id | 
+---------+--------+-------+--------+ 
| 1  | Prod 1 | 1.99 | 1 | 
| 2  | Prod 2 | 2.99 | 2 | 
| 3  | Prod 3 | 3.99 | 3 | 
| 4  | Prod 4 | 4.99 | 0 | 
| 5  | Prod 5 | 4.99 | 2 | 
+---------+--------+-------+--------+ 

我設法建立這個SQL語句來完成。

SELECT p.* FROM products AS p 
JOIN categories AS c 
ON c.cat_id = i.cat_id 
ORDER BY c.order ASC 

問題是產品不必屬於一個類別,如果他們不是這個查詢將不會檢索它們。儘管我可以在沒有連接的情況下執行第二個查詢並追加到第一個查詢中,但當我開始爲產品設置分頁時,會出現問題,因爲我認爲計算要顯示的產品會變得非常複雜。有什麼我可以做的嗎?

+2

使用'LEFT OUTER JOIN'而不是'JOIN' –

+0

[**參見Fiddle Demo **](http://sqlfiddle.com/#!2/c2c25/2) –

+0

當調用一個簡單的'JOIN'時,你告訴你的RDBMS執行一個'隱式的JOIN',告訴MySQL'嘿idk我想要什麼,所以請猜測我明確要'哪個MySQL響應'沒問題,INNER JOIN它是!' – MonkeyZeus

回答

1

您需要決定如何訂購它們。

SELECT p.* 
FROM products p LEFT JOIN 
    categories AS c 
    ON c.cat_id = i.cat_id 
ORDER BY c.`order` ASC; 

MySQL恰巧將NULL的值先按升序排序。你可能希望他們最後。所以這樣做,而不是

SELECT p.* 
FROM products p LEFT JOIN 
    categories AS c 
    ON c.cat_id = i.cat_id 
ORDER BY (c.`order` is not null) DESC, 
     c.`order` ASC; 

表達(c.order is not null)評估爲0時被定義order1當它不是。

而且,order是一個非常糟糕的名稱,因爲它是一個MySQL保留字(實際上,它保留在所有數據庫中)。您可以考慮改用priority之類的東西。

+0

我不得不添加一個'DESC'到'(c.order不爲空)'的末尾,以使它能夠將沒有類別的產品放在最後,但其他方式工作。 – Chaosxmk