我有类似的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 |
答案 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