重写为一个mySQL查询,其中第二个查询需要第一个查询的结果
我有一个类似于以下内容的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的
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