2

以下は私が持っているものです

+++++++++++++++++++++++++++
id + myDate       + name
+++++++++++++++++++++++++++
'A'+ '2012-06-05' + 'baz'
'A'+ '2012-06-04' + 'bar'
'B'+ '2012-06-05' + 'foo'
'C'+ '2012-06-05' + 'bla'
'C'+ '2012-06-04' + 'blah'
'C'+ '2012-06-06' + 'bleh'
+++++++++++++++++++++++++++

私が使用しているクエリは

SELECT id, min(myDate) as Date, name 
FROM myTable
GROUP BY id;

以下のような出力が得られます

+++++++++++++++++++++++++++
id + myDate       + name
+++++++++++++++++++++++++++
'A'+ '2012-06-04' + 'baz'
'B'+ '2012-06-05' + 'foo'
'C'+ '2012-06-04' + 'bla'
+++++++++++++++++++++++++++

私の質問は、クエリが正しい日付を教えてくれるとき、なぜ列のデータがバーではなくバズnameとして来るのか、日付はバーであるのかということです。name2012-06-04

データをテストするためのデモ。

4

3 に答える 3

5

あなたはつかみます

  1. ID、
  2. その ID の最低日付、および
  3. それに付随する名前のいずれか。

他の (通常の) データベースでは、このクエリも許可されません。nameに集約関数を使用するか、nameも追加する必要がgroup byあります。MySQL は代わりにランダムな値を選択しますが、そこに問題があります。

これを解決するために、クエリは少し複雑になります。

select
  t.id, 
  t.mydate,
  t.name
from
  myTable t
where
  t.mydate = 
    (select 
      min(td.mydate) 
    from 
      myTable td 
    where 
      td.id = t.id)

または:

select
  t.id, 
  t.mydate as date,
  t.name
from
  myTable t
  inner join 
    (select 
      td.id
      min(td.mydate) as date
    from 
      myTable td 
    group by 
      td.id) tx on tx.id = t.id and tx.date = t.mydate
于 2012-06-13T08:26:41.790 に答える
1

あなたの特定の質問については、あなたがする必要があるのは、連結されたフィールドにMIN関数を適用することだけです:

SELECT id, min(CONCAT(myDate,' ++ ',name)) as date_name 
FROM myTable
GROUP BY id;

サーバーサイドスクリプトで処理します


GROPUBYを使用しています。つまり、結果の各行は値のグループを表します。それらの値の1つは、グループ名(グループ化したフィールドの値)です。残りは、そのグループ内の任意の値です。
たとえば、次の表:

F1   |   F2
1         aa
1         bb
1         cc
2         gg
2         hh

uがF1でグループ化する場合:SELECT F1,F2 from T GROUP BY F1 2つの行が表示されます。

1    and one value from (aa,bb,cc)
2    and one value from (gg,hh)

決定論的な結果セットが必要な場合は、グループに適用するアルゴリズムをソフトウェアに指示する必要があります。いくつかの例:

  1. MIN
  2. MAX
  3. カウント

などなど

あなたの場合、uは決定論的アルゴリズムをフィールドに適用しなかったので、nameuはセットから「ランダム」な結果を取得します。

于 2012-06-13T08:29:57.037 に答える
1

DevArt が指摘したように、別のクエリを使用する必要があります。

SELECT m.* from myTable m join
(select id, min(myDate) md from myTable group by id) mm
on m.id=mm.id and m.myDate=md

既存のクエリは name 列に制約を指定していません。これが、期待した結果が得られない理由です。Group byのような関数を使用して値を取得できるセットのみを作成するminか、何も指定しない場合はランダムに作成します。

于 2012-06-13T08:23:15.403 に答える