3

私のテーブルpayment_statusには、次のフィールドがあります。

  • id
  • Payment_id
  • 状態
  • 作成した
  • によって作成された

多くのエントリが同じpayment_idを持つ可能性があります...したがって、1つのpayment_idの最後のステータスを取得したいと思います...

このリクエストは機能しますが、ロードに時間がかかりすぎます...payment_idでグループ化して最後のステータスを取得するための最適化バージョンが必要です。

SELECT pstatus.*
FROM `payment_status` AS pstatus
WHERE pstatus.id = (
   SELECT id
   FROM `payment_status`
   WHERE pstatus.status = '200'
   ORDER BY created DESC
   LIMIT 1
)
GROUP BY pstatus.payment_id
ORDER BY pstatus.payment_id DESC
4

5 に答える 5

3

このクエリを試してください-

SELECT t1.* FROM payment_status t1
  JOIN (SELECT payment_id, MAX(created) max_created
        FROM payment_status
        GROUP BY payment_id
        ) t2
    ON t1.payment_id = t2.payment_id AND t1.created = t2.max_created;

...次に、必要なWHERE条件を追加します。

于 2012-09-20T12:55:17.893 に答える
1

使用してみてくださいJOIN

SELECT p1.*
FROM payment_status p1
INNER JOIN
(
    SELECT id, MAX(created) MaxCreated
    FROM payment_status 
    WHERE status = '200'
    GROUP BY id
) p2 ON p1.id = p2.id AND p1.created = p2.MaxCreated
ORDER BY p1.payment_id DESC
于 2012-09-20T12:52:48.743 に答える
1

これはうまくいくはずです

SELECT *
FROM  payment_status
WHERE status = '200'    
ORDER BY created DESC
LIMIT 1
于 2012-09-20T12:55:02.060 に答える
0

あなたはこれを行うことができるべきではありませんか?:

(作成されたのはタイムスタンプであると想定しているため、「last」=「最新」)

SELECT pstatus.*
FROM `payment_status` AS pstatus
GROUP BY pstatus.payment_id, pstatus.status
ORDER BY pstatus.payment_id DESC, pstatus.created DESC

返される各行には、最新のステータスのpayment_idが含まれている必要があります。

于 2012-09-20T12:55:00.140 に答える
0

MySQLデータベースを使用していると思います。

ここに私は解決策が速くて読みやすいです:

select 
    substring_index(
        group_concat(status order by created desc)
        , ',', 1
    ) as status_latest 
from payment_status 
group by payment_id

他のSQLステートメントよりも高速であると確信しています。試してみてください。

于 2013-06-28T06:23:55.767 に答える