2017-01-23 2 views
0

私のテーブル構造によりグループと第二位の日付を取得することは、私が欲しいこの

catName class age 
------------------- 
AAA  4  19 
AAA  3  14 
AAA  3  12 
AAA  3  9 
BBB  7  12 
BBB  6  12 
BBB  7  17 
CCC  8  10 
DDD  9  10 
DDD  9  11 

結果のようなものですcatNameやクラスによってグループの二番目に大きい年齢を取得することです。 だから、結果は

AAA 3 14 
BBB 7 12 
DDD 9 10 

である必要があり、私はこれは少しトリッキーですが、ここでは一つの方法であるMySQLの

+0

あなたは第二位を探しているなら、なぜcatnameやクラスのグループごとに1つ持つ行が、結果にいますか? –

+0

'Order BY DESC、class ASC' – Ibu

+1

あなたは「CatNameとクラスで2番目に大きいグループを取得しました」と言っていますが、AAA、4、BBB、6は2番目に大きいですが、出力。だから、あなたは複数のルールを持っているので、これはMySQLを超えていると思うので、スクリプト(PHP)レベルで行うべきです。そして、あなたは少なくともあなたが何をしようとしているのかを示す必要があります - あなたは自由な(自宅の)仕事を求めているようです。 – user3741598

答えて

2

のクエリを見つける助けてください:

select catname, class, 
     (case when count(*) > 1 
      then substring_index(substring_index(group_concat(age order by age desc), ',', 2), ',' -1) 
      else max(age) 
     end) as age 
from t 
group by catname, class; 
0

は、それはあなたが何であるかを少し不明です実際には - あなたの出力例があなたの指定した要件と一致しません。

以下のクエリは、グループごとに2番目に高い年齢を返します(存在する場合)。グループの年齢が1つだけの場合、何も返されません。

select a.class, 
     a.catName, 
     max(age) as second_highest_age 
from table1 as a 
     left join 
     (
      /* get the highest age for this class/catName */ 
      select class, 
        catName, 
        max(age) as maxAge 
      from table1 
      group by class, 
        catName 
     ) as b 
     on a.class = b.class 
     and a.catName = b.catName 
/* filter out records where the age is equal to the max age for this group */ 
/* this will leave the second-highest age in each group (if one exists) */ 
where a.age <> b.maxAge 
group by a.class, 
     a.catName 

SQLfiddle here

+0

Ohに記載されているように、標準的な解決策が推奨されます。右。グループ内にレコードが1つしかない場合は、何も返されません。私はあなたの質問をチェックし、応答します。ありがとう。私の質問の期待結果セクションを更新しました。 – romhail

+0

最後のb.catNameをa.catNameに変更した後で動作します。ありがとう。 – romhail

+0

ああ、オタクに申し訳ありません。あなたがうまく働いてうれしい、私は私の答えを編集しました。 – Alex