2

我有一个类似这样的 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 的旧应用程序。

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

假设该表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 | 计数 |
|++++++++++++++|
| 222 | 2 |
| 223 | 2 |
| 224 | 1 |

4

4 回答 4

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
于 2013-10-16T17:26:38.820 回答
1

如果您仍然持有...试试这个...内部查询为您正在寻找的一个 ID 获得不同的“c1”值(即: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
于 2013-10-17T01:04:52.417 回答
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
于 2013-10-17T00:25:20.170 回答
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
于 2013-10-17T11:23:55.760 回答