MYSQL选择加入,排序和空值

时间:2012-06-15 09:33:52

标签: php mysql select join

我有两张桌子。

Table 1.
========
id
post
--------

Table 2.
========
id
post_id
thumbs_sum
--------

查询看起来像:

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中对结果进行排序,如何确定此问题?

4 个答案:

答案 0 :(得分:3)

如果您想在排序时将NULL值翻译为数字0,则必须像这样增强ORDER BY子句:

ORDER BY IFNULL(t2.sum, 0) DESC

请记住,此方法会阻止MySQL使用可能的索引。因此,订购数千条记录可能会很慢。

答案 1 :(得分: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

答案 2 :(得分:3)

select distinct可能需要花费更长的时间才能返回,具体取决于数据量,你最好使用“group by t2.id”,例如你可以,结果会相同,但会更快。 还要研究索引表以提高性能。

回答你的问题,我会用

order by ifnull(t2.sum, 0) DESC

您的另一个选择是在数据库表设计中将默认值设置为零,这将永远不会成为问题;)

答案 3 :(得分: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

该函数将获得第一个非空值。