2012-06-20 94 views
0

我有一個MySQL查詢,我想優化一點點。那就是:在子查詢中使用來自外部MySQL查詢的列

SELECT `items`.category AS 'Category', 'Without' AS 'Which', COUNT(*) AS 'Count' 
FROM `items` 
WHERE `id`=706 
GROUP BY `category` 

UNION 

SELECT `items`.category AS 'Category', 'With' AS 'Which', COUNT(*) AS 'Count' 
FROM `items` 
WHERE `id`=706 AND `qa_items`.pointsoff=0 
GROUP BY `category`; 

我得到的是這樣的:

+---------------------------+---------+-------+ 
| Category     | Which | Count | 
+---------------------------+---------+-------+ 
| Category A    | Without |  3 | 
| Category B    | Without |  8 | 
| Category C    | Without |  4 | 
| Category A    | With |  2 | 
| Category B    | With |  6 | 
| Category C    | With |  4 | 
+---------------------------+---------+-------+ 

但我想是這樣的:

+---------------------------+---------+-------+ 
| Category     | Without | With | 
+---------------------------+---------+-------+ 
| Category A    |  3 |  2 | 
| Category B    |  8 |  6 | 
| Category C    |  4 |  4 | 
+---------------------------+---------+-------+ 

我知道我可能要做的某些子查詢排序,但我不知道我將如何引用我在子查詢中查找的類別。我確信這裏有一些簡單的東西我錯過了。誰能幫忙?謝謝!

回答

1

在這裏你可以簡單地丟棄UNION和使用,而不是:

SELECT 
    category as Category, 
    COUNT(*) as Without, 
    SUM(pointsoff = 0) as With 
FROM items 
WHERE id=706 
GROUP BY category; 

注意SUM(布爾條件)模式。這是一個真的有用值得記住的技巧,因爲它有一些漂亮的性能明智的用法。請注意,您可以使用您想要的任何布爾條件,並且它只會給出滿足條件的組中的行數。

+0

這是一個很好的把戲。謝謝! –

0

而不是你的查詢......你會想要做這樣的事情

SUM(IF(items.Without, 1,0)) as Without, SUM(IF(items.With, 1,0)) as With for the columns