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

重写为一个mySQL查询,其中第二个查询需要第一个查询的结果,mysql,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的每个返回值进行计数,而不限制c3的

我有一个类似于以下内容的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的每个返回值进行计数,而不限制c3的值

是否可以重写第一个查询,以便它也返回
计数器的聚合结果?换句话说,我希望得到一个结果集,其中包括
c1、c2、计数器

我尝试编写子查询,但不起作用:

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 | 现在,对于这3个值中的每一个,我想计算该值在完整表中出现的次数
a

| c1 | count | |+++++++++++++| | 222 | 2 | | 223 | 2 | | 224 | 1 | |c1 |计数| |+++++++++++++| | 222 | 2 | | 223 | 2 | | 224 | 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

解决方案是连接到使用子查询创建的临时表

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

如果你仍然持有。。。试试这个。。。内部查询为您正在查找的ID(即101)获取不同的“c1”值。这是一个独特的列表,现在可以重新连接到原始的完整表,但仅限于找到的那些“c1”值。然后按找到的所有数据分组,并根据递减计数排序,将最高的数据放在列表的顶部

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

只需将表自身连接起来并使用count:-

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

是的,你是对的,但是我把问题简单化了,犯了一个错误。实际上,表b和表a是同一张表。一旦我执行了主查询,其中包括c3的WHERE子句,将其限制为单个值,我需要为c2的每个值重新查询同一个表,而不会缩小基于c3的结果。好的,在这种情况下,只需取出从左连接开始的整行。您的问题仍然引用了第二个表b。如果你能更新问题,我会完全更新答案。不确定你想要的结果是什么。。。您能否显示一些显示重复行/值的示例数据,以及基于示例数据作为返回集的期望值。谢谢您的建议。我们的解决方案看起来非常相似。效率有差异吗?@jalperin,它们实际上是相同的,唯一显著的区别是仔细观察后应用的顺序。但由于没有“选中”的答案表示找到了解决方案,我甚至没有看另一个答案,因为我离开原始评论的时间更长。请注意,这与上面@DRapp的解决方案非常相似
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