2013-05-14 120 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