2013-03-18 52 views
0

這裏是場景。我有像這樣帶有複雜聚合結果的MYSQL查詢

經驗模式兩個表:(ID,標題)

user_experience:(ID,experience_id,CREATED_DATE)

當用戶添加一個經驗給他做的名單,一個記錄被添加到user_experience中。現在我想知道一個經歷達到2,5或10個里程碑的里程碑的日期。

要求的結果:ID(experience.id),標題,CREATED_DATE,計數(沒有誰上市經驗的用戶)

如果經驗獲得10個製表,然後將結果應包括與時間記錄當它有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 

臨屋提前:)

+0

你能給出表格格式的樣本記錄嗎? – 2013-03-18 15:14:53

+0

@Adee。 。 。你的查詢很好。 MySQL不支持您需要更簡潔的純SQL解決方案的窗口函數。 – 2013-03-18 15:35:54

+0

@JW,這裏是你的示例數據:) – Adee 2013-03-19 07:00:18

回答

1

NKS該查詢可能做的伎倆:

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

注重的數據排序是使用運行變量的工作是什麼讓。

+0

現在,這正是我想要的,但沒有成功。非常感謝 :) – Adee 2013-03-19 07:29:24