【问题标题】:SQL query finds nothing, but returns 1 row with all nullsSQL 查询什么也没找到,但返回 1 行全部为空
【发布时间】:2012-01-04 16:32:48
【问题描述】:

我有这个问题:

select problems.problem_id , creator_member_id , problem_title , problem_description , sum( vote ) as totalVotes , DAYOFMONTH(problem_date) , DAYNAME(problem_date) , YEAR(problem_date) , MONTH(problem_date) , first_name , last_name , email , small_thumb , mid_thumb 
    from problems 
        left join problem_votes 
            on problems.problem_id = problem_votes.problem_id 
        left join users 
            on problems.creator_member_id = users.user_id 
        left join member_photo 
            on problems.creator_member_id = member_photo.member_id 
    where problems.problem_id = 1;

它不匹配,并返回:

-+--------------------+---------------------+------------+-----------+-------+-------------+-----------+
| problem_id | creator_member_id | problem_title | problem_description | totalVotes | DAYOFMONTH(problem_date) | DAYNAME(problem_date) | YEAR(problem_date) | MONTH(problem_date) | first_name | last_name | email | small_thumb | mid_thumb |
+------------+-------------------+---------------+---------------------+------------+--------------------------+-----------------------+--------------------+---------------------+------------+-----------+-------+-------------+-----------+
|       NULL |              NULL | NULL          | NULL                |       NULL |                     NULL | NULL                  |               NULL |                NULL | NULL       | NULL      | NULL  | NULL        | NULL      |
+------------+-------------------+---------------+---------------------+------------+--------------------------+-----------------------+--------------------+---------------------+------------+-----------+-------+-------------+-----------+

但我想知道为什么它会返回任何东西?架构有问题吗?还是查询?

我正在检查它是否没有返回任何内容,并试图返回 404 页面,但系统认为有 1 个返回行,所以它混淆了我的应用程序。

我在这里可能做错了什么?

谢谢!!

【问题讨论】:

  • 看不到它会如何返回任何内容,因为您明确强制它只返回问题.problem_id = 1 的行。
  • @MarcB 是的,我也是——很奇怪,对吧? :)
  • 我相信这与在没有 group by 子句的情况下使用像 sum 这样的聚合函数有关。添加group by 子句可能会修复它,或者您可能还需要将您的条件更改为having 而不是where。 (或者我可能完全错了。)
  • 我认为它必须在 select 子句中将 sum(vote) 作为 totalVotes 做一些事情
  • @grossvogel 是的,你是对的。当我取出该子句时,它按预期返回空。但问题是我还需要它来计数,大声笑 - 有什么办法可以解决这个问题?

标签: mysql sql database left-join


【解决方案1】:

尝试在查询末尾添加以下子句:

GROUP BY problems.problem_id, creator_member_id, problem_title, 
problem_description, problem_date, first_name, last_name, 
email, small_thumb ,mid_thumb 

最佳实践是每一个被选择但未聚合的列(如投票)都必须在 group by 子句中,尽管 MYSQL 不强制执行此操作。相反,它的行为很奇怪,使人们感到困惑。 (请参阅this answer 以获得更好的解释。)

【讨论】:

  • 这正是我的问题。来自PostgreSQL的背景,我习惯了DB不让我马虎......
【解决方案2】:

问题是由于

sum( vote ) as totalVotes

如果您想使用聚合函数作为 SUM 来对结果集进行分组,您必须使用 声明为 GROUP BY。

如果你想过滤那个结果,你应该使用 HAVING

http://database-programmer.blogspot.com/2008/04/group-by-having-sum-avg-and-count.html

在你的情况下,我认为这应该可行:

SELECT problems.problem_id , creator_member_id , problem_title , problem_description , SUM( vote ) AS totalVotes , 
DAYOFMONTH(problem_date) , DAYNAME(problem_date) , YEAR(problem_date) , MONTH(problem_date) , first_name , last_name , email , small_thumb , mid_thumb 
FROM problems 
    LEFT JOIN problem_votes 
        ON problems.problem_id = problem_votes.problem_id 
    LEFT JOIN users 
        ON problems.creator_member_id = users.user_id 
    LEFT JOIN member_photo 
        ON problems.creator_member_id = member_photo.member_id
 WHERE problems.problem_id = 1; 
GROUP BY problems.problem_id , creator_member_id , problem_title , problem_description , problem_date , first_name , last_name , email , small_thumb , mid_thumb 

【讨论】:

    【解决方案3】:

    首先,确保你没有一个全为 NULL 的行

    然后:LEFT JOIN 关键字返回左表 (table_name1) 中的所有行,即使右表 (table_name2) 中没有匹配项。

    尝试将其更改为 INNER JOIN

    【讨论】:

    • WHERE 子句过滤problems.problem_id,这是连接中最左边的表中的一个值。然而结果显示problems.problem_id 为NULL。更改为 INNER JOIN 在这里应该没有效果。我怀疑问题出在 SQL 本身之外。
    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多