141

usersテーブルとテーブルがありpayments、ユーザーごとに支払いがあり、paymentsテーブルに複数の支払いが関連付けられている場合があります。支払いがあるすべてのユーザーを選択したいのですが、最新の支払いのみを選択します。この SQL を試していますが、ネストされた SQL ステートメントを試したことがないので、何が間違っているのか知りたいです。助けに感謝します

SELECT u.* 
FROM users AS u
    INNER JOIN (
        SELECT p.*
        FROM payments AS p
        ORDER BY date DESC
        LIMIT 1
    )
    ON p.user_id = u.id
WHERE u.package = 1
4

11 に答える 11

188

ごとに最新の日付を取得するには、サブクエリが必要ですuser ID

SELECT  a.*, c.*
FROM users a 
    INNER JOIN payments c
        ON a.id = c.user_ID
    INNER JOIN
    (
        SELECT user_ID, MAX(date) maxDate
        FROM payments
        GROUP BY user_ID
    ) b ON c.user_ID = b.user_ID AND
            c.date = b.maxDate
WHERE a.package = 1
于 2012-09-21T07:45:11.803 に答える
11
SELECT u.*, p.*, max(p.date)
FROM payments p
JOIN users u ON u.id=p.user_id AND u.package = 1
GROUP BY u.id
ORDER BY p.date DESC

このsqlfiddleをチェックしてください

于 2012-09-21T07:44:57.443 に答える
3
   SELECT u.* 
        FROM users AS u
        INNER JOIN (
            SELECT p.*,
             @num := if(@id = user_id, @num + 1, 1) as row_number,
             @id := user_id as tmp
            FROM payments AS p,
                 (SELECT @num := 0) x,
                 (SELECT @id := 0) y
            ORDER BY p.user_id ASC, date DESC)
        ON (p.user_id = u.id) and (p.row_number=1)
        WHERE u.package = 1
于 2012-09-21T07:55:26.700 に答える
2

クエリには 2 つの問題があります。

  1. すべてのテーブルとサブクエリには名前が必要なので、サブクエリに名前を付ける必要がありますINNER JOIN (SELECT ...) AS p ON ...
  2. あなたが持っているサブクエリは1行の期間しか返しませんが、実際にはuser ごとに1行が必要です。そのためには、1 つのクエリで最大日付を取得してから、自己結合して行全体を取得する必要があります。

に同点がないと仮定して、次のことpayments.dateを試してください。

    SELECT u.*, p.* 
    FROM (
        SELECT MAX(p.date) AS date, p.user_id 
        FROM payments AS p
        GROUP BY p.user_id
    ) AS latestP
    INNER JOIN users AS u ON latestP.user_id = u.id
    INNER JOIN payments AS p ON p.user_id = u.id AND p.date = latestP.date
    WHERE u.package = 1
于 2012-09-21T07:47:08.730 に答える
2

@John Wooの答えは、同様の問題を解決するのに役立ちました。正しい順序も設定することで、彼の答えを改善しました。これは私のために働いています:

SELECT  a.*, c.*
FROM users a 
    INNER JOIN payments c
        ON a.id = c.user_ID
    INNER JOIN (
        SELECT user_ID, MAX(date) as maxDate FROM
        (
            SELECT user_ID, date
            FROM payments
            ORDER BY date DESC
        ) d
        GROUP BY user_ID
    ) b ON c.user_ID = b.user_ID AND
           c.date = b.maxDate
WHERE a.package = 1

ただし、これがどれほど効率的かはわかりません。

于 2016-10-12T13:14:13.733 に答える