2014-07-04 25 views
2

有什麼辦法可以使以下工作成功?在CASE中使用從另一個SELECT中獲取的字段

SELECT 
(SELECT COUNT(foo) FROM table2 WHERE table1.id = table2.id) AS foos 
CASE 
WHEN foos <= 0 THEN 0 
WHEN foos > 0 THEN 1 
END 
AS isFoos 
FROM table1 

我得到它的工作的唯一辦法是這樣的:

SELECT 
(SELECT COUNT(foo) FROM table2 WHERE table1.id = table2.id) AS foos 
CASE 
WHEN (SELECT COUNT(foo) FROM table2 WHERE table1.id = table2.id) <= 0 THEN 0 
WHEN (SELECT COUNT(foo) FROM table2 WHERE table1.id = table2.id) > 0 THEN 1 
END 
AS isFoos 
FROM table1 

它看起來絕對可怕。

請注意,該示例沒有描述我有問題的SQL查詢,它描述了我想要從查詢中刪除的語法。

謝謝:)

編輯:修正了SQL以更好地解釋問題。

編輯2:這是小提琴,我希望它有幫助。

http://sqlfiddle.com/#!2/18a45d/2

小提琴包含產品和代理產品。產品可以製成多條生產線,生產線可以生產多種產品。

pr_connected顯示應與產品一起使用的行數,SELECT計數顯示實際使用產品的行數。

與我一起工作的db存在一些缺陷,並且由於寫入的代碼量太多而無法修復。

回答

1

我將使用基於新的查詢您的更新和您的sqlfiddle。我打算使用子查詢,但只有一個COUNT(*)聚合函數,它的結果與您的結果相同。

SELECT pr_id, pr_name, connected, 
CASE 
    WHEN connected <= 0 THEN "RED" 
    WHEN connected < pr_connected THEN "YELLOW" 
    WHEN connected >= pr_connected THEN "GREEN" 
END as Status 
FROM (
    SELECT pr_id, pr_name, pr_connected, 
    (SELECT COUNT(pl_id) FROM product_line WHERE pl_product_id = pr_id) AS connected 
     FROM product 
     GROUP BY pr_name 
    ) tt 

檢查我Fiddle Demo

+0

這樣做,謝謝! :) –

+0

不客氣@TeroHeiskanen。很高興有幫助。快樂編碼和上帝保佑。 – Edper

+0

我在想我的原始解決方案(每種情況下的SELECT)和解決方案之間是否存在任何性能差異?只要表現良好,我不介意SQL查詢的外觀。 –

1
SELECT IF(COUNT('foo') > 0, 1, 0) as `isFoos` FROM `table1` 

OR

SELECT 
    `t`.`foos`, 
    IF(`t`.`foos` > 0, 1, 0) as `isFoos` 
FROM 
    (SELECT COUNT(`x`) AS `foos` FROM `stackoverflow`) as `t` 
+0

這就是爲什麼我說我需要這個確切的查詢工作。我知道我可以在這種情況下使用IF,但在我的代碼中它不會工作。 –

0

希望這有助於:

select email, 
case 
when count(email) > 2 then 55 
when count(email) < 2 then 33 
end 
as cc 
from supportContacts 
group by email 

我都忍了這裏SQL小提琴http://sqlfiddle.com/#!2/94e3dd/10

+0

對不起,我的SQL似乎沒有很好地解釋這個問題。請檢查編輯的SQL。 –

+0

你可以請創建一個小提琴(如我的上面)與示例表結構和一些數據,所以我們可以解決它。我有問題,看你的表有什麼關係。 – zveljkovic

+0

當然,它將不得不等到下個星期。 –

相關問題