1

たとえば、「メンバー」という名前のテーブルがあるとします

    id     name
 ===================
    a      John
    b      Frank

メンバーは「login_activities」を持っています

    id     login_time     gol     member
==========================================
    1      2012-10-01      99      a
    2      2012-10-01     125      b
    3      2012-11-01     255      a
    4      2012-11-02     111      b
    5      2012-11-07     101      a

メンバーの初回ログイン時と前回ログイン時の情報、および最後のログインからの「gol」値のみを含むビューを作成したいと考えています。

出来ますか?

私は多くの方法を試しました。私の試みの1つ:

CREATE VIEW   view_firstlast
     AS
          SELECT
               MIN(a.login_time) as first_login,
               MAX(a.login_time) as last_login,
               a.gol,
               b.name
          FROM
               login_activities a
                   JOIN member b ON a.member = b.id
          GROUP BY
               a.member

正しい結果が得られません。「gol」値は最初のログインからのものです。これを行う方法?


ここで重要なこと: MySQL は作成ビューでのサブクエリを許可していません

4

3 に答える 3

2

あなたはほとんどそこにいます。ログイン時間はありますが、最後のログイン ID も取得して、ログイン アクティビティ テーブルへの再結合と、ユーザーと日付/時刻フィールドでの結合を単純化します。 ID の主キーであり、必ずしも (member, login_time) にあるとは限りません。ただし、メンバー別にグループ化された日付の最小/最大を使用するこのクエリでは、最適化のために (member, login_time) に必ずインデックスを作成します。

SELECT
      m.Name,
      PreQuery.First_Login,
      PreQuery.Last_Login,
      LA2.GOL
   from
      ( select
              LA.member,
              MIN(LA.login_time) as first_login,
              MAX(LA.login_time) as last_login,
              MAX(LA.ID) as LastLoginID
          FROM
              login_activities LA
          group by
              LA.member ) PreQuery
        JOIN member M
           ON PreQuery.member = M.id
        JOIN login_activities LA2
           ON PreQuery.LastLoginID = LA2.id

次に、上記は機能しますが、MySQL がビューを実装する方法が原因で失敗するため、次のように 2 つのビューで実行する必要がある場合があります。

create view MemberFirstLastOnly
as 
select
      LA.member,
      MIN(LA.login_time) as first_login,
      MAX(LA.login_time) as last_login,
      MAX(LA.ID) as LastLoginID
   FROM
      login_activities LA
   group by
      LA.member

それから別の

create view MemberLastFirstFinal
as
    SELECT
          m.Name,
          MFLO.First_Login,
          MFLO.Last_Login,
          LA2.GOL
       from
          MemberFirstLastOnly MFLO
            JOIN member M
               ON PreQuery.member = M.id
            JOIN login_activities LA2
               ON PreQuery.LastLoginID = LA2.id
于 2012-11-28T12:08:52.950 に答える
0

これを試して:

CREATE VIEW   view_firstlast
     AS
          SELECT
               MIN(a.login_time) AS first_login,
               MAX(a.login_time) AS last_login,
               a.gol,
               b.name
          FROM member b 
               LEFT JOIN login_activities a
                   a.member = b.id
          GROUP BY
               b.member
于 2012-11-28T12:00:47.000 に答える
0

login_activities テーブルに再度参加する必要がありますが、別の列の最大/最小で行全体を取得できる mysql の特別な機能を使用します。

CREATE VIEW view_firstlast AS
SELECT
    MIN(a.login_time) as first_login,
    MAX(a.login_time) as last_login,
    c.gol,
    b.name
FROM login_activities a
JOIN member b ON a.member = b.id
JOIN (
    SELECT * FROM (
        SELECT gol, member
        FROM login_activities
        ORDER BY login_time desc) x
    GROUP BY member) c ON c.member = b.member
GROUP BY a.member
于 2012-11-28T12:56:40.670 に答える