gpt4 book ai didi

mysql - 是否可以同时获取结果并计算结果? (根据结果计数过滤结果)

转载 作者:行者123 更新时间:2023-11-29 13:48:38 24 4
gpt4 key购买 nike

我有一个查询,我想同时获取结果和结果计数。结果的过滤很复杂,所以我不能简单地使用子查询技巧,如other question 。我的最终目标是根据结果计数过滤结果。

示例:

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,因为我想获得所有结果。我不能使用子查询,因为它意味着执行复杂的过滤两次。

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

最佳答案

以下查询:

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>

在 MySQL 中获得等效的而不重复 where 子句是具有挑战性的。

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

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

最后一个方法,假设 lated_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

这会将“lated_info”转换为列表,然后匹配回原始数据。这也可以通过原始数据中的唯一 id 来完成(该 id 不是基于示例数据)。

关于mysql - 是否可以同时获取结果并计算结果? (根据结果计数过滤结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17043777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com