2012-01-04 32 views
2

我有這個疑問:SQL查詢覺得沒有什麼,但返回1行的所有空

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個返回的行,所以它會混淆我的應用程序。

任何我可能在這裏做錯了?

謝謝!

+4

無法看到它是如何從任何回報你明確強制它只返回其中problems.problem_id = 1的行。 – 2012-01-04 16:36:31

+0

@MarcB我也是 - 非常奇怪,對不對? :) – GeekedOut 2012-01-04 16:44:00

+0

我相信這與使用'sum'這樣的聚合函數沒有'group by'子句有關。添加'group by'子句可能會修復它,或者您可能還需要將條件更改爲'having'而不是'where'。 (或者我可能是完全錯誤的。) – grossvogel 2012-01-04 16:45:05

回答

3

嘗試加入以下條款到您的查詢的末尾:

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

+0

這是我的問題。來自PostgreSQL的背景,我習慣了數據庫不讓我sl ...不馴...... – Nostradamnit 2012-12-06 13:06:11

-1

首先,確保你沒有行與所有NULL

則:LEFT JOIN關鍵字返回左表(table_name1)的所有行,即使在右表(不匹配table_name2)。

嘗試將其更改爲INNER JOIN

+1

WHERE子句過濾'problems.problem_id',它是連接中最左邊表中的一個值。然而結果顯示'problems.problem_id'爲NULL。更改爲INNER JOIN在這裏不起作用。我懷疑這個問題不在SQL本身之內。 – MatBailie 2012-01-04 16:37:28

3

的問題是由於

sum(vote) as totalVotes 

如果你想使用聚合函數SUM分組結果集,你必須使用一個 語句GROUP通過。

如果你希望篩選的結果,你應該使用具有

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 
相關問題