1

我有两张桌子。

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

4 回答 4

3

如果要将NULL值转换为排序中的数字 0,则必须像这样增强ORDER BY子句:

ORDER BY IFNULL(t2.sum, 0) DESC

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

于 2012-06-15T09:43:06.560 回答
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
于 2012-06-15T09:43:22.857 回答
3

根据数据量,选择 distinct 可能需要更长的时间才能返回,您最好使用“group by t2.id”,例如,在可能的情况下,结果将相同但会更快。还研究索引表以提高性能。

回答你的问题,我会用

order by ifnull(t2.sum, 0) DESC

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

于 2012-06-15T09:53:48.810 回答
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

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

于 2012-06-15T09:53:03.943 回答