2016-08-31 3 views
0

クエリにいくつか問題があります。私が持っているテストと呼ばれるテーブルでは、4列、ID、コード、値、時間を言うことができます。コード内の値は重複することができます(重複していることもあります)。これまでは、データベースにクエリを実行して、複製されたすべての結果を取得することができます。問題は、それらの重複した行から最初の2行だけを取得したいということです。私のような行があればそう:各種類の最初に2つの複製を取得するMYSQLクエリ

1, dw9e87, 12, 2016-08-31 12:00:00; 
2, dw9587, 3, 2016-08-31 10:30:00; 
3, dw9587, 22, 2016-08-31 09:30:00; 
4, qq5368, 10, 2016-08-31 09:35:00; 
5, qq5368, 35, 2016-08-31 10:10:00; 

を結果は示すべきである:

1, dw9e87, 12, 2016-08-31 12:00:00; 
2, dw9587, 3, 2016-08-31 10:30:00; 
4, qq5368, 10, 2016-08-31 09:35:00; 
5, qq5368, 35, 2016-08-31 10:10:00; 

最初のコードの場合には、IDが1及び2の方が新しいからです。それはクエリでこれを行うことは可能ですか?ありがとう!

+0

すべての重複レコードを取得したいですか? –

+0

申し訳ありませんが、質問は私には分かりません。 「これらの重複行から最初の2行を取得する」とはどういう意味ですか? – Brae

+0

大丈夫、多分私は多くの情報を与えなかった...ごめんなさい。テーブルに多数のレコードがあるとします。これは単なる例です。今やアイデアは列 "コード"の重複だけを取り戻し、重複がある場合は最初の2つを取得することです。今はもっと意味がありますか?ありがとう! –

答えて

0

あなたが最初の2つの重複レコードをしたい場合は、変数が頭に浮かぶ:

実際
select t.* 
from (select t.*, 
      (@rn := if(@c = code, @rn + 1, 
         if(@c := code, 1, 1) 
         ) 
      ) as rn 
     from t cross join 
      (select @rn := 0, @c := '') params 
     order by code, time desc 
    ) t 
where rn <= 2; 

、それは同様シングルトンを返すので、かなりのない仕事をしています。したがって:

select t.* 
from (select t.*, 
      (@rn := if(@c = code, @rn + 1, 
         if(@c := code, 1, 1) 
         ) 
      ) as rn 
     from t cross join 
      (select @rn := 0, @c := '') params 
     where code in (select code from t group by code having count(*) >= 2) 
     order by code, time desc 
    ) t 
where rn <= 2 ; 
+0

前に変数を使用したことはありません。ありがとう!!!!!! –

関連する問題