1

私はテーブルを持っています:

ID | time
1 | 300
1 | 100
1 | 200
2 | 200
2 | 500

私は私が得ることができることを 知っている2nd rowすべてのものを手に入れたいID
1st row

select ID,time from T group by ID;  

しかし、IDごとに2行目を取得する方法がわかりません。のand句
については知っていますが、ここでの使用方法がわかりません。 どうすればできますか?limitoffsetmysql

EDIT : Actually, time is not ordered. I forgot to specify that. I have made an edit in the table.
4

4 に答える 4

2

私はそれを作る方法を知っていますが、私はそれを修正できませんでした.多分あなたはそれを修正することができます. 私のクエリを修正するために提案をいただければ幸いです

最初にこれを使用して、各 ID の最初の行を選択します。

                  SELECT min(id) id 
                 FROM TableName t2
                 group by id

次に、min(id) をnot in選択する最初のクエリである min(id) を選択します (2 行目)。

そのように

      SELECT  min(id) id ,time
      FROM TableName 
      WHERE id NOT IN    (
                          SELECT min(id) id 
                          FROM TableName 
                          GROUP BY id
                         )
      GROUP BY id

**私が言ったように、それはただの提案です。それは私に0の値を返します。それを修正すれば、役立つように投稿を編集させてください

ここでデモ

于 2013-02-02T13:51:21.427 に答える
0

あなたが持っているテーブルでこれを行うことはできません。あなたは勇敢な試みをすることができます:

select id, time
from (select id, time
      from t
      group by t
     ) t
where not exists (select 1 from t t2 where t2.id = t.id and t2.time = t.time)
group by id

つまり、最初の行を除外しようとします。

これが不可能な理由は、テーブルが本質的に順序付けられていないためです。そのため、テーブルには「秒」の実際の定義はありません。これにより、SQL エンジンは、処理中に適切と思われる行を再配置する機会を得ることができます。これにより、パフォーマンスが大幅に向上する可能性があります。

あなたが使用している構造でさえ:

select id, time
from t
group by id

は、最初の行から時刻を返す保証はありません。これは、隠し列と呼ばれる MySQL の (誤った) 機能です。実際には、すべての値が同じ場合のみを対象としています。実際には、最初の行から値を取得しているように見えますが、それを保証することはできません。

おそらく最善の解決策は、自動インクリメント列を持つ新しいテーブルにデータを選択することです。

create table newtable (
    autoid int auto_increment,
    id int,
    time int
);

insert into newtable(id, time)
    select id, time from t;

実際には、これはおそらく元のテーブルと同じ順序を維持し、autoid を使用して 2 番目の行を取得できます。ただし、強調したいのは「実際に」です。値が正しい順序であるという保証はありませんが、おそらくそうなるでしょう。

于 2013-02-02T17:59:50.467 に答える