0

我有一个要同时获取结果和结果计数的查询。结果的过滤很复杂,所以我不能像其他问题那样简单地使用子查询技巧。我的最终目标是根据结果计数过滤结果。

例子:

SELECT id, related_info, count(related_info) 
FROM my_table 
WHERE <complex filtering on related_info here>;

结果应如下所示:

id | related_info |  count(related_info)|
1  |         info1|                    3|
1  |         info2|                    3|
1  |         info3|                    3|
2  |         info1|                    2|
2  |         info2|                    2|

我的最终目标是根据计数过滤结果,例如:

SELECT id, related_info, count(related_info) 
FROM my_table 
WHERE <complex filtering on related_info here> having count(related_info) >=3;`

结果应如下所示:

id | related_info |  count(related_info)|
1  |         info1|                    3|
1  |         info2|                    3|
1  |         info3|                    3|
id过滤 2 的结果)

我不能使用group by,因为我想得到所有的结果。我不能使用子查询,因为这意味着要执行两次复杂的过滤。

我看不到任何方法可以通过单个查询来执行此操作。

4

2 回答 2

1

以下查询:

SELECT id, related_info, count(related_info)
FROM my_table
WHERE <complex filtering on related_info here>
group by id, related_info with rollup

会产生如下结果:

id | related_info |  count(related_info)|
1  |         info1|                    1|
1  |         info2|                    1|
1  |         info3|                    1|
1  |         NULL |                    3|

rollup添加带有摘要信息的额外行。

在大多数数据库中,解决方案很简单:

SELECT id, related_info, count(related_info) over (partition by id)
FROM my_table
WHERE <complex filtering on related_info here>

在不重复该where子句的情况下在 MySQL 中获得等效项是具有挑战性的。

MySQL 中的一个典型替代方法是,如果您需要“related_info”列表,请使用group_concat

select id, group_concat(related_info), count(*)
from my_table
where <complex filtering on related_info here>
group by id;

最后一种方法,假设它related_info是唯一标识每一行的单列:

select mt.id, mt.related_info, t.cnt
from my_table mt join
     (select id, group_concat(related_info) as relatedInfoList, count(*) as cnt
      from my_table
      where <complex filtering on related_info here>
      group by id
     ) t
     on mt.id = t.id and
        find_in_set(related_info, relatedInfoList) > 0

这会将“related_info”变成一个列表,然后匹配回原始数据。这也可以通过原始数据中的唯一 id 来完成(id不是基于样本数据)。

于 2013-06-11T12:48:04.023 回答
0

尝试使用计数分析功能。语法是 COUNT(*) OVER (PARTITION BY ...)。您可以在此处找到更多信息:http: //msdn.microsoft.com/en-us/library/ms189461.aspx

于 2013-06-11T12:48:08.393 回答