4

ここでは、MySQL クエリを使用してきれいに解決しようとしている問題を簡単に説明します。これは、私が扱っている実際のテーブルではありません。

次のテーブルがある場合:

Name Buyer ID  
John Fred  4  
John Smith 3  
Fred Sally 2  
John Kelly 1

以下を返すクエリが必要です。

Name Buyer ID      
John Fred  4  
Fred Sally 2  

「名前」でグループ化し、最新の行/購入者/ID を表示するようにします。

ネストされたselectステートメントを実行することでこれを実装しようとしました。最初に「ORDER BY ID DESC」を実行し、次に最も外側のSELECTで「GROUP BY NAME」を実行しました。そして、これは問題を解決するための回りくどい方法ですが、順序によって、正しい選択が返されるように思われました。残念ながら、「GROUP BY」は、「Buyer」列に予期されるエントリが含まれることを「保証」しません。

これをクエリとして実装するのに役立つ提案はありますか? 現時点では、大きなテーブル ダンプに対して非常に効率の悪い PHP 'バージョン' のクエリを実行していますが、これは間違いなく最良の選択ではありません。

4

2 に答える 2

4

これを試してみてください。サブクエリの背後にある考え方は、(集計関数)を使用IDしてそれぞれ最新のものを取得することです。次に、サブクエリの 2 つの列でテーブル自体に対して結合します。NameMAX

SELECT  a.*
FROM    tableName a
        INNER JOIN 
        (
            SELECT name, MAX(ID) maxID
            FROM tableName
            GROUP BY name
        ) b ON a.Name = b.Name AND
                a.ID = b.MaxID
于 2012-11-16T03:47:07.943 に答える
1

もう 1 つの方法は、サブクエリでソートされたデータをロードし、結果をグループ化することです。これを引用することはできませんが、いくつかの場所で、これには(識別可能な)パフォーマンスへの影響がないことを読みました。

次のようなものです:

SELECT * 
FROM (
    SELECT * 
    FROM `yourtable` 
    ORDER BY `id` DESC
) as `tmp` 
GROUP BY `name`
于 2012-11-16T03:53:36.530 に答える