2

各メンバーが異なる数のトランザクションレコードを持っている可能性があるMySQLデータベースから各メンバーの最新のトランザクションを取得しようとしています。また、SPECIAL ORDERレコードを取得しないように、トランザクションテーブルをcustomersテーブルにリンクする必要があります。

これが私のSQLです:

Select  membertransactions.maingym_id,
        membertransactions.member_id,
        membertransactions.action_id,
        Max(membertransactions.date_time) As 'Latest Transaction Date', 
        membertransactions.date_time

From    bd1.membertransactions
  Inner Join    db1.customers 
  On    membertransactions.member_id = customers.id
Where   customers.orderno <>'SPECIAL ORDER'

AND     membertransactions.main_id = 1

AND     Date_Format(membertransactions.date_time,'%Y%m%d') < '20121101'

Group By membertransactions.member_id, 'Latest Transaction Date'

顧客ごとに1つの行を取得しますが、必ずしも時系列で最新の行であるとは限りません。私は本当にここで立ち往生していて、提供された助けを大いに感謝します。

ありがとう

4

1 に答える 1

2

mysqlを使用しているため、mysqlの特別な機能を使用してこれを簡単に行うことができます。方法は次のとおりです。

select * from (
    Select
        membertransactions.maingym_id,
        membertransactions.member_id,
        membertransactions.action_id,
        membertransactions.date_time
    From bd1.membertransactions
    Join db1.customers On membertransactions.member_id = customers.id
    Where customers.orderno <> 'SPECIAL ORDER'
    AND membertransactions.main_id = 1
    AND Date_Format(membertransactions.date_time,'%Y%m%d') < '20121101'
    order by membertransactions.date_time desc) x
Group By member_id

私はそれらを完全に削除しmax(date)、内側の選択はすべてのレコードを最新の最初の日付順に取得し、次に外側の選択はmember_idによってグループ化します。重要な点は次のとおりです。mysqlでは、残りの列を集約せずにgroup byを使用している場合、グループの最初の行を取得します。

他のデータベースでは、このSQLで構文エラーが発生しますが、mysqlでは魅力のように機能します


また、より読みやすいフォーマットにも注意してください。なぜ人々が「各行の2番目の単語を左揃えにする」フォーマットを使用するのか理解できませんでした。私は最初にそれをした人を見つけて、彼をむち打ちさせることができたらいいのにと思います。

于 2012-11-15T14:33:19.577 に答える