0

ユーザーの支払いでいっぱいのテーブルがあります。各ユーザーは複数の支払いを受けることができます。各ユーザーの最新の支払いを選択しようとしています。

SELECT DATE_FORMAT(FROM_UNIXTIME(MAX(p.date)), "%D %M %Y") as last_payment, p.user_id, p.amount, p.period, p.txn_id, u.name 
FROM payments as p
INNER JOIN users as u
ON u.id = p.user_id
GROUP BY p.user_id
ORDER BY p.date DESC

現在、これはうまく機能しているようです。last_paymentフィールドは確かにユーザーの最後の支払いの日付です。唯一の問題は、他の支払いフィールドが好きp.txn_idでありp.amount、必ずしもユーザーの最後の支払いと同じ行に対応しているとは限りませんが、以前の支払いからのものです。

MAX(p.date)を選択しているときに、同じ行から他のフィールドも選択していることを確認するにはどうすればよいですか。

助けに感謝します。

4

4 に答える 4

1

グループごとの最大値を探しています。最も一般的な方法は、支払いテーブルをグループ化された結果に結合することです。

SELECT   DATE_FORMAT(FROM_UNIXTIME(p.date), '%D %M %Y') AS last_payment,
         p.user_id, p.amount, p.period, p.txn_id, u.name
FROM     payments AS p NATURAL JOIN (
           SELECT   user_id, MAX(date) date
           FROM     payments
           GROUP BY user_id
         ) t JOIN users AS u ON u.id = p.user_id
ORDER BY p.date DESC

元のクエリがまったく機能した (そしてエラーをスローしなかった) 唯一の理由は、MySQL の非標準の拡張機能によるものGROUP BYであることに注意してください。

MySQL は の使用を拡張して、選択リストが句GROUP BYで指定されていない非集計列を参照できるようにします。GROUP BYこれは、前述のクエリが MySQL で有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、 で指定されていない各非集計列のすべての値がGROUP BY各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。

于 2013-06-04T14:45:16.843 に答える
0
SELECT u.*
     , x.*
  FROM payments x
  JOIN (SELECT user_id,MAX(date) max_date FROM payments GROUP BY user_id) y
    ON y.user_id = x.user_id
   AND x.date = y.max_date
  JOIN users u
    ON u.id = x.user_id;
于 2013-06-04T15:19:14.813 に答える