重写为一个mySQL查询,其中第二个查询需要第一个查询的结果

时间:2013-10-16 17:16:54

标签: 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子句使用“main”查询中检索到的值。)

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

编辑以显示数据和所需结果:

假设表a如下所示:

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

给定c2的指定值,我找到c1的所有匹配值。那么,如果c2=101

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

现在,对于这三个值中的每一个,我希望Count值出现在完整表a中的次数:

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果你还在抱着...试试这个...内部查询变得清晰" c1"您要查找的一个ID的值(即:101)。这是一个不同的列表,现在重新加入原始的FULL表,但仅限于那些" 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

答案 2 :(得分: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

答案 3 :(得分: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