【问题标题】:MYSQL select with join, sorting and null valuesMYSQL 使用连接、排序和空值进行选择
【发布时间】:2012-06-18 08:55:33
【问题描述】:

我有两张桌子。

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 中对结果进行排序,如何解决这个问题?

【问题讨论】:

    标签: php mysql select join


    【解决方案1】:

    select distinct 可能需要更长的时间才能返回,具体取决于数据量,您最好在可能的情况下使用“group by t2.id”,结果将相同但速度更快。 还考虑为您的表建立索引以提高性能。

    回答你的问题,我会用

    order by ifnull(t2.sum, 0) DESC
    

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

    【讨论】:

      【解决方案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】:

        我试图弄清楚这里的实际问题是什么。 “如何决定这个问题”有点深奥。

        无论如何,我认为,这里的问题是我们有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
        

        【讨论】:

        • @Indeveler 请记住,对于大数据,它会变得非常慢..您也可以尝试我提供的解决方案。
        【解决方案4】:

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

        ORDER BY IFNULL(t2.sum, 0) DESC
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          • 2013-06-17
          • 1970-01-01
          • 2016-06-15
          相关资源
          最近更新 更多