MySQL函数,必须带回一行

MySQL函数,必须带回一行,mysql,null,Mysql,Null,我有一个简单的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 现在,如果没有日期为2010年3月2日的行,那么查询将返回零个结果,这是正确的,但我希望它返回一行-即使结果为空。我不是绝对肯定的,但是这个case语句可能会起作用。我不能在atm机

我有一个简单的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

现在,如果没有日期为2010年3月2日的行,那么查询将返回零个结果,这是正确的,但我希望它返回一行-即使结果为空。

我不是绝对肯定的,但是这个case语句可能会起作用。我不能在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

我不是绝对肯定,但这个案例陈述可能有效。我不能在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
挑选 AVGq1+AVGq8+AVGq15/3作为Res 来自tresults 其中id为“1”,日期为“2010年3月2日”,q25为“1” 按q25分组

联合所有

选择NULL作为Res 来自双重 不存在的地方 选择 AVGq1+AVGq8+AVGq15/3作为Res 来自tresults 其中id为“1”,日期为“2010年3月2日”,q25为“1” 按q25分组

由于第二部分,将始终返回一行。

选择 AVGq1+AVGq8+AVGq15/3作为Res 来自tresults 其中id为“1”,日期为“2010年3月2日”,q25为“1” 按q25分组

联合所有

选择NULL作为Res 来自双重 不存在的地方 选择 AVGq1+AVGq8+AVGq15/3作为Res 来自tresults 其中id为“1”,日期为“2010年3月2日”,q25为“1” 按q25分组


由于第二部分,将始终返回一行。

您只需选择一行作为常量,然后将其左键连接到结果集:

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
工作原理:

选择您的常量,因为常量始终返回一行 左联接始终至少返回一次左表中的所有行 如果右表没有行,则整个左表将扩展为一组空列,结果只有一行 如果右表有n行,则结果有n行,每行都有一个额外的常量列
您只需选择一行作为常量,然后将其左键连接到结果集:

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
工作原理:

选择您的常量,因为常量始终返回一行 左联接始终至少返回一次左表中的所有行 如果右表没有行,则整个左表将扩展为一组空列,结果只有一行 如果右表有n行,则结果有n行,每行都有一个额外的常量列
如果正确返回none,为什么要它返回一行,该行应该包含什么?返回NULL就可以了。如果正确返回none,为什么要它返回一行,该行应该包含什么?返回NULL就可以了。看起来很有趣-但是,我得到以下错误:1248-每个派生表都必须有自己的alias@Homer_J-我忘记了联接表后面的别名;我已经更新了我的答案来解决这个问题。看起来很有趣-但是,我得到了以下错误:1248-每个派生表都必须有自己的表alias@Homer_J-我忘记了联接表后面的别名;我已经更新了我的答案来解决这个问题。