首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有复杂聚合结果的MYSQL查询

具有复杂聚合结果的MYSQL查询
EN

Stack Overflow用户
提问于 2013-03-18 23:12:48
回答 1查看 157关注 0票数 0

这是一个场景。我有两个表,它们的模式如下

经验:(id,职务)

user_experience:(id,experience_id,created_date)

当用户将体验添加到其待办事项列表中时,user_experience中会添加一条记录。现在我想知道当体验达到2,5或10个列表的里程碑时的日期。

必填结果: id (experience.id),title,created_date,count (列出体验的用户数)

如果一个体验获得了10个列表,那么结果应该包括对应于它获得2个和5个列表的时间的记录。

我使用这个查询来获得所需的结果,并寻找一个更好的“查询”。

代码语言:javascript
复制
SELECT e.id, e.title, ue_res.created_date, ue_res.count FROM
experience e INNER JOIN
(
    SELECT ue.experience_id, (
        SELECT COUNT(uee.id) FROM user_experience uee WHERE uee.experience_id = ue.experience_id AND uee.created_date <= ue.created_date
    ) AS `count`, ue.created_date FROM user_experience ue
) ue_res
ON e.id = ue_res.experience_id
WHERE ue_res.uecount IN (2,5,10)
ORDER BY e.id,ue_res.created_date ASC 

我不能为成就创建另一个表,因为里程碑可以随时更改,所以我只查找一个查询。

下面是一些示例数据

体验示例数据:

代码语言:javascript
复制
1   |   Bunjee jump from Eifel Tower
2   |   Surf in Rio
3   |   Fly over Grand Canyon
4   |   Go to a Mexican resturant

User_experience的示例数据:

代码语言:javascript
复制
1   |   1   |   2013-03-01
2   |   4   |   2013-03-02
3   |   1   |   2013-03-03
4   |   3   |   2013-03-04
5   |   2   |   2013-03-05
6   |   3   |   2013-03-06
7   |   4   |   2013-03-07
8   |   1   |   2013-03-08
9   |   1   |   2013-03-09
10  |   1   |   2013-03-10
11  |   3   |   2013-03-11
12  |   2   |   2013-03-12
13  |   2   |   2013-03-13

示例数据的结果:

代码语言:javascript
复制
1   |   Bunjee jump from Eifel Tower    |   2013-03-03  |   2
3   |   Fly over Grand Canyon           |   2013-03-06  |   2
4   |   Go to a Mexican resturant       |   2013-03-07  |   2
1   |   Bunjee jump from Eifel Tower    |   2013-03-10  |   5
2   |   Surf in Rio                     |   2013-03-12  |   2

提前感谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 00:10:47

下面的查询可能会做到这一点:

代码语言:javascript
复制
SET @helper:=0;

SET @oldid:=0;

SELECT ue.experience_id AS id,
       e.title,
       ue.created_date,
       ue.helper        AS milestone
FROM   (SELECT ue.id,
               ue.experience_id,
               ue.created_date,
               CASE @oldid
                 WHEN ue.experience_id THEN ( @helper := @helper + 1 )
                 ELSE ( @helper := 1 )
               end                            AS helper,
               ( @oldid := ue.experience_id ) oldid
        FROM   user_experience ue
        ORDER  BY ue.experience_id ASC,
                  ue.created_date ASC) ue
       JOIN experience e
         ON ( e.id = ue.experience_id )
WHERE  ue.helper IN ( 2, 5, 10 );  

请注意,数据排序是使运行变量发挥作用的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15480210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档