2013-10-16 219 views
2

我有一个类似的MySQL的查询:改写为一体的MySQL查询,其中第一个查询的结果需要第二次查询

SELECT c1, c2 FROM a WHERE a.c3 = 123 

我有第二个查询,我需要执行像这样c2的每个值:

SELECT COUNT(*) AS `Counter` FROM a WHERE a.c2 = [each value of a.c2] 

此刻,我编程循环遍历第一个查询的每个结果并执行第二个查询。所以,发生的情况是主查询使用特定的c3值来生成结果集。然后,第二个查询使用该结果集并为c2的每个返回值执行COUNT,而对c3的值没有任何限制。

是否可以重写第一个查询,以便它也返回Counter的聚合结果?换句话说,我想结束一个包含c1, c2, Counter的结果集。

我试着写一个子查询,但是,这并不工作:

SELECT c1, c2, 
(SELECT COUNT(*) AS `Counter` FROM a) 
FROM a WHERE a.c3 = 123 

(我不知道如何使WHERE子句中使用检索到的值从“主”查询)。

我正在使用一个使用mySQL 4.1的旧应用程序。

EDIT显示的数据和预期的结果:

假设表a如下所示:

 
| c1 | c2 | 
|+++++++++++| 
| 222 | 101 | 
| 223 | 101 | 
| 224 | 101 | 
| 222 | 102 | 
| 223 | 102 | 

鉴于C2指定的值,我发现C1的所有匹配值。所以,如果c2=101:现在

 
| c1 | 
|+++++| 
| 222 | 
| 223 | 
| 224 | 

,为每个3个的值,我想Count的次数值出现在全表a

 
| c1 | count | 
|+++++++++++++| 
| 222 | 2  | 
| 223 | 2  | 
| 224 | 1  | 

+0

不清楚自己在找什么结果......你能证明显示重复的行/值一些示例数据,以及基于样本数据作为回报集您预期的内容。 – DRapp

+0

感谢您的建议。添加。 – jalperin

回答

1

如果你仍然抱着......试试这个......内部查询为你正在查找的一个ID(即:101)获取不同的“c1”值。这是一个不同的列表,现在重新连接到原始的完整表格,但仅限于找到的那些“c1”值。然后根据DESCENDING计数将所有找到的和订单分组,以将最高位置放到列表的顶部。

SELECT 
     a.c1, 
     COUNT(*) as NumCount 
    from 
     (select distinct a.c1 
      from a where a.c2 = 101) GetThese 
     JOIN a 
      ON GetThese.c1 = a.c1 
    group by 
     a.c1 
    order by 
     COUNT(*) DESC, 
     a.c1 
+0

我们的解决方案看起来非常相似。效率有差异吗? – jalperin

+0

@ jalperin,他们几乎是相同的,只有显着的差异是顺序通过应用后看更近。但由于没有答案作为“检查”,表明WAS找到了解决方案,所以我甚至没有看到其他答案,因为我从原始评论中离开了更多时间。 – DRapp

1

我相信你能做到这通过一个简单的连接:

SELECT a.c1, a.c2, count(*) as `counter` FROM a 
LEFT JOIN b ON a.c2 = b.c2 
WHERE a.c3 = 123 
GROUP BY a.c1, a.c2 
+0

是的,你是对的,但我通过简单的问题在我的问题中犯了一个错误。实际上,表b与a相同。一旦我执行了包含c3的WHERE子句的主查询将其限制为单个值,我需要针对每个c2值重新查询同一个表,而不缩小基于c3的结果。 – jalperin

+0

我已经编辑了最初的问题,以便更清楚。 – jalperin

+0

好的,在这种情况下,只需从整个行开始左连接。你的问题仍然引用第二张表b。如果你能更新这个问题,我会全面更新答案。 – ModulusJoe

0

该解决方案是一个连接到一个用子查询创建的临时表。

SELECT b.c1 , COUNT(*) 
FROM a 
JOIN (SELECT c1 
FROM a 
WHERE c2=XXXX) 
AS `b` 
ON a.c1 = b.c1 
GROUP BY b.c1 
+0

请注意,这与@ DRapp的解决方案非常相似 – jalperin

0

刚刚加入该表对本身和使用计数: -

SELECT a.c1, a.c2, COUNT(b.c1) 
FROM a 
LEFT OUTER JOIN a b 
ON a.c1 = b.c1 
WHERE a.c2 = 101 
GROUP BY a.c1 
相关问题