2013-05-14 124 views
0

我想查询几个选择在一个,我的查询工作没有最后一个SELECT,但与它我有一个错误,这是Operand should contain 1 column 有人可以告诉我如何纠正?加入SQL查询结果在一个


SELECT (
SELECT COUNT(*) FROM mytable WHERE TYPE = 'MSS' AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
) as TOTAL_MSS, 
( 
SELECT COUNT(*) FROM mytable WHERE TYPE = 'MSS' AND S = 0 AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
) as MSS_S, 
(
SELECT COUNT(*) FROM mytable WHERE TYPE = 'MSS' AND S != 0 AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
) as MSS_F, 
(
SELECT COUNT(*) as Nb ,OR as TOP FROM mytable WHERE TYPE = 'MSS' AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) GROUP BY OR ORDER BY Nb DESC LIMIT 1 
) 

如果我执行它们分开,我得到

TOTAL_MSS MSS_S MSS_F 
99   12  87 

Nb TOP 
78 [email protected] 

回答

1

你应该使用UNION加入结果和第二ORTOP的关键字,所以你需要逃避他们(假设你的表有一个名为列或)首先:

SELECT 
    COUNT(*) as Nb , 
    `OR` as `TOP` 
FROM 
    mytable 
WHERE 
    TYPE = 'MSS' 
    AND YEAR(date) = YEAR(CURDATE()) 
    AND MONTH(date) = MONTH(CURDATE()) 
GROUP BY 
    `OR` 
ORDER BY 
    Nb DESC 
LIMIT 1 

同样是在UNION ALL查询都必须场相同数量的,你必须为第1场和第二场2

SELECT 
    SUM(IF(`TOP` = 'one',`Nb`,0)) as first_one, 
    SUM(IF(`TOP` = 'two',`Nb`,0)) as second_one, 
    SUM(IF(`TOP` = 'three',`Nb`,0)) as thrid_one, 
    SUM(IF(`TOP` NOT IN ('three','two','one'),`Nb`,0)) as forth_one, 
    GROUP_CONCAT(IF(`TOP` NOT IN ('three','two','one'),`TOP`,'') SEPARATOR '') as `OR` 
FROM (
    SELECT 
     COUNT(*) as Nb, 
     'one' as `TOP` 
    FROM 
     mytable 
    WHERE 
     TYPE = 'MSS' 
     AND YEAR(date) = YEAR(CURDATE()) 
     AND MONTH(date) = MONTH(CURDATE()) 
    UNION ALL 
    SELECT 
     COUNT(*) as Nb, 
     'two' as `TOP` 
    FROM 
     mytable 
    WHERE 
     TYPE = 'MSS' 
     AND S=0 
     AND YEAR(date) = YEAR(CURDATE()) 
     AND MONTH(date) = MONTH(CURDATE()) 
    UNION ALL 
    SELECT 
     COUNT(*) as Nb, 
     'three' as `TOP` 
    FROM 
     mytable 
    WHERE 
     TYPE = 'MSS' 
     AND S<>0 
     AND YEAR(date) = YEAR(CURDATE()) 
     AND MONTH(date) = MONTH(CURDATE()) 
    UNION ALL 
    SELECT 
     `Nb`, 
     `TOP` 
    FROM(
     SELECT 
     COUNT(*) as Nb , 
     `OR` as `TOP` 
     FROM 
     mytable 
     WHERE 
     TYPE = 'MSS' 
     AND YEAR(date) = YEAR(CURDATE()) 
     AND MONTH(date) = MONTH(CURDATE()) 
     GROUP BY 
     `OR` 
     ORDER BY 
     Nb DESC 
     LIMIT 1 
    ) as tmp 
)as tmp1 

UPDATE前3个查询,就可以恢复到:

SELECT 
    SUM(IF(S=0,1,0)) as MSS_S, 
    SUM(IF(S<>0,1,0)) as MSS_F, 
    COUNT(*) as TOTAL_MSS 
FROM 
    mytable 
WHERE 
    TYPE = 'MSS' 
    AND YEAR(date) = YEAR(CURDATE()) 
    AND MONTH(date) = MONTH(CURDATE()) 
+0

错误是:“使用的select语句的列数不同” – 2013-05-14 07:57:59

+1

@KirkERW这很奇怪,因为来自union的所有查询都有2列:'Nb'和'TOP ' – Stephan 2013-05-14 08:00:39

+0

@KirkERW对不起,我忘了一个逗号请现在就来试试 – Stephan 2013-05-14 08:01:52

1

使用UNION

SELECT_STMT1 UNION SELECT_STMT2 UNION SELECT_STMT3 UNION SELECT_STMT4 

AS

SELECT COUNT(*) FROM mytable WHERE TYPE = 'MSS' AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
) as TOTAL_MSS UNION 
( 
SELECT COUNT(*) FROM mytable WHERE TYPE = 'MSS' AND S = 0 AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
) as MSS_S UNION 
(
SELECT COUNT(*) FROM mytable WHERE TYPE = 'MSS' AND S != 0 AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
) as MSS_F UNION 
(
SELECT COUNT(*) as Nb ,OR as TOP FROM mytable WHERE TYPE = 'MSS' AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
GROUP BY OR ORDER BY Nb DESC LIMIT 1 
+0

我没有,但有一个错误 – 2013-05-14 07:37:29

+0

看到我的编辑.... – Gautam3164 2013-05-14 07:37:54

+0

这是@KirkERW工作.. ?? – Gautam3164 2013-05-14 07:41:09

2

尝试此查询

SELECT 
    * 
FROM 
(SELECT 
    1 as rId, 
    count(*) as TOTAL_MSS, 
    sum(if(S = 0, 1, 0)) as MSS_S, 
    sum(if(S <> 0, 1, 0)) as MSS_F 
FROM 
    mytable 
WHERE 
    TYPE = 'MSS' AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE())) a 
INNER JOIN 
    (SELECT 
     1 as rId, 
     COUNT(*) as Nb, 
     OR as TOP 
    FROM 
     mytable 
    WHERE 
     TYPE = 'MSS' AND YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE()) 
    GROUP BY 
     OR 
    ORDER BY 
     Nb DESC LIMIT 1)b 
ON 
    a.rID = b.rID; 

希望这有助于...

+0

+1是像我这样的一些枢轴,但没有子查询 – Stephan 2013-05-14 07:59:05