首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL select with join、sorting和NULL值

MYSQL select with join、sorting和NULL值
EN

Stack Overflow用户
提问于 2012-06-15 17:33:52
回答 4查看 516关注 0票数 1

我有两张桌子。

代码语言:javascript
复制
Table 1.
========
id
post
--------

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

查询如下所示:

代码语言:javascript
复制
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个帖子(sum -拇指上下之和):

代码语言:javascript
复制
1. sum = 3
2. sum = 1
3. sum = 5
4. sum = null
5. sum = -2

帖子编号4在表2中没有任何记录,这就是我的查询返回下一个记录的原因:

代码语言:javascript
复制
1. sum = 5
2. sum = 3
3. sum = 1
4. sum = -2
5. sum = null

如果我没有能力改变数据库表的结构并在PHP中对结果进行排序,如何决定这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-15 17:43:23

我在试着弄清楚这里真正的问题是什么。“如何决定这个问题”有点深奥。

无论如何,我假设,这里的问题是,对于没有投票的帖子,我们有null值作为拇指总和。当我们对它们进行排序时,我们可能希望用零替换空值。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2012-06-15 17:43:07

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

代码语言:javascript
复制
ORDER BY IFNULL(t2.sum, 0) DESC

请记住,此方法可防止MySQL使用可能的索引。因此,对数千条记录进行排序可能会很慢。

票数 3
EN

Stack Overflow用户

发布于 2012-06-15 17:53:49

根据数据量的不同,select distinct可能需要更长的时间才能返回,您最好在可以的情况下使用"group by t2.id“,结果将是相同的,但会更快。另外,还可以对表进行索引以提高性能。

在回答你的问题时,我会使用

代码语言:javascript
复制
order by ifnull(t2.sum, 0) DESC

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11048103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档