2012-02-14 51 views
1

我有這個簡單的MySQL聲明:MySQL的功能,必須帶回一排

SELECT 
    ((AVG(q1) + AVG(q8) + AVG(q15))/3) AS Res 
FROM tresults 
WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
GROUP BY q25 

現在,如果有與MARCH2010,則查詢返回結果爲零的日期(這是正確的)無行,但我希望它返回一行 - 即使結果是NULL

+0

爲什麼你希望它返回一行,如果它正確地返回一個沒有,該行應該包含什麼? – JohnCambell 2012-02-14 15:17:55

+0

返回NULL將會很好。 – 2012-02-14 15:20:30

回答

1

你可以只選擇一個單列爲一個常數,然後將其left join到結果集:

select l.*, r.* 
from (select "your constant" as constant) as l 
left join ( 
    SELECT 
    ((AVG(q1) + AVG(q8) + AVG(q15))/3) AS Res 
    FROM tresults 
    WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
    GROUP BY q25 
) as r on 1 

這是如何工作的:

  • select "your constant" as constant總是返回單行
  • left join總是返回left表中的所有行至少一次
  • 如果right表沒有行,那麼整個left表擴展了一堆空列,結果有一行
  • 如果right表有n行,結果有n行,每行都有一個額外的「你的常量「列
+0

看起來很有趣 - 但是,我得到以下錯誤:#1248 - 每個派生表都必須具有自己的別名 – 2012-02-14 15:38:51

+0

@Homer_J - 我在連接表後面忘記了一個別名;我已經更新了我的答案來解決這個問題。 – 2012-02-14 15:42:18

0

我不是絕對肯定的,但這種情況下的聲明可能工作。我無法測試它atm。

Case When 
    (SELECT 
    Count(*) 
    FROM tresults 
    WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
    GROUP BY q25) > 0 
Then 
    SELECT 
    ((AVG(q1) + AVG(q8) + AVG(q15))/3) AS Res 
    FROM tresults 
    WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1' 
    GROUP BY q25 
Else 
    SELECT null 
End 
0

SELECT ((AVG(Q1)+ AVG(Q8)+ AVG(Q15))/ 3)AS RES
FROM tresults WHERE ID = '1' AND日期= 'MARCH2010' AND Q25 = '1' GROUP BY Q25

UNION ALL

SELECT NULL AS RES FROM雙 WHERE NOT EXISTS( SELECT ((AVG(Q1)+ AVG(Q8)+ AVG(Q15))/3)AS Res
FROM tresults WHERE ID = '1' 和日期= 'MARCH2010' AND Q25 = '1' GROUP BY Q25 )

總是會返回一個行怎麼一回事,因爲第二部分。