2012-07-24 275 views
4

我有以下代碼:的MySQL - 查詢返回NULL

SELECT q25, (
(
AVG(q1) + AVG(q2) + AVG(q3)) /3) AS Overall 
FROM t_results 
WHERE brand = 'XYZ' 
AND DATE = 'MAY2012' 
GROUP BY q25 
ORDER BY Overall 
DESC LIMIT 1 

如果沒有通過查詢phpMyAdmin的發現數據返回下面的消息(這是相當正確的):

MySQL returned an empty result set (i.e. zero rows). (Query took 0.0178 sec) 

但是,我想要的是實際返回一個NULL值,這可能嗎?我很欣賞這可能不是最佳做法,但我正在使用繼承的代碼,這可能是解決方案的最簡單和最快捷的途徑。

由於一如既往

H.

+0

@MvG - 作爲一個感興趣的問題,你編輯了什麼? – 2012-07-24 12:08:10

+0

單擊* edited *之後的鏈接,您將看到[編輯歷史記錄](http://stackoverflow.com/posts/11629211/revisions)。我首先更改了語法突出顯示,然後更改了標記。這與php無關,選擇sql標籤將確保默認情況下sql突出顯示,以及答案。另外給你更合適的專家來看看這個問題。 – MvG 2012-07-24 12:13:57

+0

@MvG - 歡呼,非常感謝。就像第二個選項一樣。 – 2012-07-24 12:23:00

回答

3

創建一個只有一行的表格。然後,您可以使用左連接實現所需的NULL結果。

CREATE TABLE dummy (d TINYINT NOT NULL); 
INSERT INTO dummy SET d = 1; 

SELECT q25, 
     ((AVG(q1) + AVG(q2) + AVG(q3)) /3) AS Overall 
FROM dummy LEFT JOIN t_results 
    ON brand = 'XYZ' 
AND DATE = 'MAY2012' 
GROUP BY q25 
ORDER BY Overall DESC 
LIMIT 1 

您還可以使用子查詢替換虛表:

SELECT q25, 
     ((AVG(q1) + AVG(q2) + AVG(q3)) /3) AS Overall 
FROM (SELECT 1) AS dummy LEFT JOIN t_results 
    ON brand = 'XYZ' 
AND DATE = 'MAY2012' 
GROUP BY q25 
ORDER BY Overall DESC 
LIMIT 1 

通過sqlfiddle,在這裏你還可以嘗試使用替代測試這一點。

選擇結果的條件,原來在WHERE條款中,現在必須進入ON條款。否則,左連接將生成非NULL行,如果找不到匹配的行,則將被WHERE刪除,而不生成單個NULL行。如果在原始查詢中沒有WHERE條件,則ON 1可用於表示any row matches

+0

非常優雅的解決方案:-) - 謝謝。 – 2012-07-24 12:07:54

0

coalesce()函數可以用來從多個以逗號分隔的列或串的返回第一個非空值。值/列從左到右進行評估,因此如果要將字符串彈出到非空參數中,請確保將其放置在要測試的列的右側。

select 
    coalesce(
    (
    SELECT 
     q25 
    FROM 
     t_results 
    WHERE 
     brand = 'XYZ' 
     AND DATE = 'MAY2012' 
    GROUP BY 
     q25 
    LIMIT 1 
    ), 'null') as q25, 
    coalesce(
    (
    SELECT 
     ((AVG(q1) + AVG(q2) + AVG(q3)) /3) AS Overall 
    FROM t_results 
    WHERE 
     brand = 'XYZ' 
     AND DATE = 'MAY2012' 
    LIMIT 1 
    ), 'null') as Overall 
from 
    t_results 
group by 
    1, 2; 

如果你沒有,你where子句匹配數據,這將返回null, null作爲行。

+0

酷...查詢...其他任何東西? – rlemon 2012-07-24 10:52:25

+0

@fluffeh - 爲此歡呼 - 認爲有錯誤,應該是'空'嗎?當我改變,我得到的消息'操作數應該包含1列's' – 2012-07-24 10:53:25

+0

@Homer_J是的,對不起,也忘了在查詢中'group by'。試試:) – Fluffeh 2012-07-24 10:54:53

2

您可以使用UNIONLIMIT相結合,提供NULL值:

(SELECT q25, 
     (AVG(q1) + AVG(q2) + AVG(q3))/3 AS Overall 
FROM t_results 
WHERE brand = 'XYZ' 
AND DATE = 'MAY2012' 
GROUP BY q25 
ORDER BY Overall DESC 
LIMIT 1 
) 
UNION ALL 
(SELECT NULL, NULL) 
LIMIT 1; 

這僅當你知道第一個查詢絕不會產生不止一個結果的作品,雖然。這裏是這種情況,所以這可能是您的最佳解決方案,但我的other answer中給出的方法更一般。

有一個fiddle這個試驗。

+0

我認爲這實際上比我潦草寫出的查詢要優雅得多。 +1 – Fluffeh 2012-07-24 12:05:37

+0

是的,更好! :-)但是,已經實施了第一個。你想讓我勾選這個嗎? – 2012-07-24 12:21:59

+0

@Homer_J,看到我相信你接受的答案比這裏更一般,我寧願刻度線留在原地。 – MvG 2012-07-24 13:06:34