2012-07-24 167 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