0

これがシナリオです。このようなスキーマを持つ2つのテーブルがあります

体験: (id, タイトル)

user_experience: (id、experience_id、created_date)

ユーザーが自分の to do リストにエクスペリエンスを追加すると、レコードが user_experience に追加されます。ここで、エクスペリエンスが 2、5、または 10 人のリスターのマイルストーンを達成した日付を取得したいと考えています。

必要な結果: id (experience.id)、title、created_date、count (エクスペリエンスをリストしたユーザーの数)

エクスペリエンスが 10 人のリスターを獲得した場合、結果には、2 人および 5 人のリスターを獲得した時間に対応するレコードが含まれます。

このクエリを使用して必要な結果を取得し、より良い「クエリ」を探しています。

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 に答える