2013-01-17 8 views
8

これは商品表であり、数百万のレコードがあります。

enter image description hereSELECTクエリは各グループから1行を返します

私は以下のようにレコードを一覧表示したい:通常、私が使用し
:現在のSQLパフォーマンスの問題を持つ

SELECT id, 
     product_name, 
     store_id 
FROM product 
GROUP BY store_id 
ORDER BY id. 


を。このような結果を出力するにはSQLクエリが必要です。

enter image description here

+0

WHYクエリが非常に遅いのを見るために、テーブル構造とexplain文の出力を質問の一部として投稿してください。テーブル定義にインデックスを含めるようにしてください。 – Namphibian

+0

「製品から」クエリのテーブル名が記載されています –

答えて

18

これを解決するには多くの選択肢がありますが、私はお勧め1は、各store_IDについて(カラムはAUTO_INCREMENT編であると仮定し)別に最新IDを取得するサブクエリに参加していることです。 IDstore_idSQLFiddle Demo

  • SELECT a.* 
    FROM tableName a 
         INNER JOIN 
         (
          SELECT store_ID, MAX(ID) max_ID 
          FROM tableName 
          GROUP BY store_ID 
         ) b ON a.store_ID = b.store_ID AND 
           a.ID = b.max_ID 
    
    パフォーマンスを向上させるため、これらの列にインデックスを持つようにしてください。

    あなたはすべてのレコードの制限を持っているしたい場合はUPDATE 1

    、以下、これを使用し、

    SELECT ID, product_Name, store_ID 
    FROM tableName a 
    WHERE 
        (
        SELECT COUNT(*) 
        FROM tableName b 
        WHERE b.store_ID = a.store_ID AND b.ID >= a.ID 
    ) <= 2; 
    
+0

良いです。その仕事!各store_idから2レコードを制限できますか? –

+0

しかしID DESCを並べ替えることはできますか? –

+0

確かに、このリンクを見てください。http://www.sqlfiddle.com/#!2/ba920/12 –

1

これをしてくださいしてみてください。

SELECT * FROM YOURTABLE B 
JOIN (SELECT MAX(ID) MX FROM YOURTABLE GROUP BY STORE_ID) A 
ON A.STORE_ID = B.STORE_ID 
AND B.ID = A.MX 
GROUP BY B.STORE_ID 
; 
2
SELECT store_id,id,product_name FROM table_name 
WHERE id IN (SELECT MAX(id) FROM table_name GROUP BY store_id) 
ORDER BY id 

これはうまくいくはずです。あなたはstore_idまたはidのどちらかであなたのreqに従って注文することができます。

+0

@ J-W:これは構文とは別に、受け入れられた答えとどう違うのですか?どちらの場合も結果は正しいと思われます。 – Priednis

関連する問題