0

这是场景。我有两个这样的表

经验:(id,title)

user_experience:(id,experience_id,created_date)

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

所需结果:id (experience.id)、title、created_date、count(列出体验的用户数)

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

我正在使用此查询来获取所需的结果,并寻找更好的“查询”。

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 

我无法为成就创建另一个表,因为里程碑可以随时更改,所以我只是在寻找查询。

这里有一些示例数据

经验样本数据:

1   |   Bunjee jump from Eifel Tower
2   |   Surf in Rio
3   |   Fly over Grand Canyon
4   |   Go to a Mexican resturant

user_experience 的样本数据:

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

样本数据的结果:

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

提前致谢 :)

4

1 回答 1

1

此查询可能会解决问题:

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 );  

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

于 2013-03-18T16:10:46.740 回答