2012-06-20 174 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