我有两张桌子。
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中对结果进行排序,如何确定此问题?
答案 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
该函数将获得第一个非空值。