我有以下代码:
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
值,这可能吗?我感谢这可能不是最佳实践,但我正在使用继承的代码,这可能是解决方案的简单和最快捷的途径。
一如既往地谢谢,
小时。
答案 0 :(得分: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
。
答案 1 :(得分:2)
您可以使用UNION
与LIMIT
相结合来提供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可供试验。
答案 2 :(得分: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
作为一行返回。