2012-06-15 75 views
1

我有兩個表。MYSQL選擇加入,排序和空值

​​

查詢看起來像:

SELECT DISTINCT(t2.id), t2.sum, t1.id 
FROM table1 t 
    LEFT JOIN table2 t2 ON t2.post_id = t1.id 
ORDER BY t2.sum DESC 

例如,我們有5個職位(總和 - 拇指和上下):

1. sum = 3 
2. sum = 1 
3. sum = 5 
4. sum = null 
5. sum = -2 

帖子數4還沒有任何記錄在表2中,這就是爲什麼我的查詢返回下一個:

1. sum = 5 
2. sum = 3 
3. sum = 1 
4. sum = -2 
5. sum = null 

如果我無法更改數據庫表的結構並對PHP中的結果進行排序,如何確定此問題?

回答

3

我想弄清楚這裏的實際問題是什麼。 「如何決定這個問題」有點深奧。

無論如何,我認爲,這裏的問題是我們有null值作爲沒有投票的帖子的大拇指總和。當我們訂購它們時,我們可能會想用零替換空值。

SELECT DISTINCT(t2.id), t2.sum, t1.id 
FROM table1 t 
    LEFT JOIN table2 t2 ON t2.post_id = t1.id 
ORDER BY IFNULL(t2.sum, 0) DESC 
+0

哦,上帝!謝謝) – dearmisterrobot

+0

@Indeveler記住,對於大數據它會變得非常慢..你也可以嘗試我給的解決方案。 – SERPRO

3

如果你想翻譯訂貨NULL價值爲數字0,你必須提升ORDER BY條款是這樣的:

ORDER BY IFNULL(t2.sum, 0) DESC 

記住,這種方法可以防止MySQL的使用可能索引。因此訂購數千條記錄可能會很慢。

2

爲什麼不使用COALESCE

SELECT DISTINCT(t2.id), COALESCE(t2.sum, 0), t1.id 
FROM table1 t 
    LEFT JOIN table2 t2 ON t2.post_id = t1.id 
ORDER BY t2.sum DESC 

該函數將獲得第一個非空值。

3

根據數據量的不同,select distinct可能需要很長的時間才能返回,例如,如果使用「group by t2.id」,那麼結果將會相同,但速度會更快。 也考慮索引您的表以提高性能。

回答你的問題,我會用

order by ifnull(t2.sum, 0) DESC 

您的另一種選擇是在數據庫表設計來設定的默認值爲零這樣,這將永遠是一個問題;)