2017-04-06 10 views
0

データベース内で多数のテストが行​​われ、各テストはカテゴリに属し、テストの各「グループ」には「シリアル番号」(ソートのタイムスタンプ)があります。各テストは合格を持っているかそこらのように、結果を失敗:TEST_SNが最も高いカテゴリごとに行だけを返すようにクエリを作るしようとしているMySQL GROUP BY MAXの2つの列

TEST Table 
TEST_ID  TEST_NAME TEST_CAT TEST_SN  RESULT 
1   test_a  Basic  112233  Pass 
2   test_b  Basic  112233  Pass 
3   test_c  Basic  112233  Pass 
4   test_d  Basic  112233  Fail 
5   test_e  Basic  112233  Pass 
6   test_a  Basic  223344  Fail 
7   test_b  Basic  223344  Pass 
8   test_c  Basic  223344  Pass 
9   test_d  Basic  223344  Fail 
10   test_w  Advacned 112233  Fail 
11   test_x  Advacned 112233  Pass 
12   test_y  Advacned 112233  Pass 
13   test_z  Advacned 112233  Pass 

イム。 だから結果イムは、次のようになります返すようにしよう:

TEST_ID  TEST_NAME TEST_CAT TEST_SN  RESULT 
6   test_a  Basic  223344  Fail 
7   test_b  Basic  223344  Pass 
8   test_c  Basic  223344  Pass 
9   test_d  Basic  223344  Fail 
10   test_w  Advacned 112233  Fail 
11   test_x  Advacned 112233  Pass 
12   test_y  Advacned 112233  Pass 
13   test_z  Advacned 112233  Pass 

ありますのでTEST_SNの「112233」と「223344」「基本」のために、私は 以前からすべてのテストを無視したい(小さいです) TEST_SN(1,2,3,4,5行)。 「112233」はAdvacnedの唯一のTEST_SNなので、私は のすべての行(10,11,12、および13)を保持します。

私はこのクエリと近づくことができます。

SELECT 
    t.test_id, 
    t.test_name, 
    t.test_cat, 
    MAX(t.test_sn), 
    t.result 
FROM 
    car_test t 
GROUP BY 
    t.test_name, t.test_cat 

しかし、相続人、私は何を得る:

TEST_ID  TEST_NAME TEST_CAT TEST_SN  RESULT 
1   test_a  Basic  223344  Pass 
2   test_b  Basic  223344  Pass 
3   test_c  Basic  223344  Pass 
4   test_d  Basic  223344  Fail 
5   test_e  Basic  112233  Fail 
10   test_w  Advanced 112233  Fail 
11   test_x  Advanced 112233  Pass 
12   test_y  Advanced 112233  Pass 
13   test_z  Advanced 112233  Pass 

行5をまだ存在しています。私はしたいSELECT行だけのMAXTEST_SNそれぞれの値TEST_CAT

すべてのアイデア?

答えて

1

まず、カテゴリ(test_cat)ごとに最高(MAX)のtest_snを取得するクエリを作成します。このように:

SELECT t.test_cat 
     , MAX(t.test_sn) AS max_test_sn 
    FROM car_test t 
    GROUP BY t.test_cat 

その後、我々は別のクエリでインライン・ビューとしてそのクエリを使用することができます。 (問い合わせは、上記の結果セットを返します。私たちは、テーブル名の代わりにそれを参照することができます。。)簡単なデモとして:

SELECT s.test_cat 
     , s.max_test_sn 
    FROM (SELECT t.test_cat 
       , MAX(t.test_sn) AS max_test_sn 
      FROM car_test t 
      GROUP BY t.test_cat 
      ORDER BY t.test_cat 
     ) s 
    ORDER BY s.test_cat 

今、私たちは、元のテーブルにJOINを追加することができます一致する行のみを取得するにはインラインビュークエリによって返される行。例:

SELECT r.test_id 
     , r.test_name 
     , r.test_cat 
     , r.test_sn 
     , r.result 
    FROM (SELECT t.test_cat 
       , MAX(t.test_sn) AS max_test_sn 
      FROM car_test t 
      GROUP BY t.test_cat 
      ORDER BY t.test_cat 
     ) s 
    JOIN car_test r 
    ON r.test_cat = s.test_cat 
    AND r.test_sn = s.max_test_sn 
    ORDER 
    BY r.test_id 
+0

魅力的です。ありがとう。 – mcmurphy

0

あなたのgroup by節では、test_nameを使用しないでください。 test_nameを置くと、test-e & Basicの有効なグループが作成され、最大値は112233に​​なります。group by句に "test_cat"だけを入れてみましたか?

+0

ありがとうございます。 'GROUP BY'で' test_cat'だけを使うと、10行目と1行だけが返されます。 – mcmurphy