0

やや紛らわしいので、例を書き留めて出力を開始すると予想される方が簡単です。

次のようなテーブルがあります: (Unit1 - Unit2 列は、同じ一般的な形式で最大 30 列にまたがることができます)

| ID | Name | Unit1_left | Unit2_left |
| 1  | Tom  |     50     |     NULL   |
| 2  | Tom  |    NULL    |      1     |
| 3  | Tom  |     45     |     NULL   |
| 4  | Dan  |    NULL    |     NULL   |

私が選択しようとしているのは、次のようなテーブルです。

| Name | Unit1_left | Unit2_left |
| Tom  |     45     |      1     |
| Dan  |    NULL    |     NULL   |

それが行っているのは、名前でグループ化し、存在する場合は他の 2 つの列の最後の値を見つけようとすることです (存在しない場合は NULL を返します)。

私は他のさまざまな質問を見てきましたが、それらはすべて使用するように言っていますMax()が、これは最高値を選択するため機能しません (間違っています)。MsSQL には、Last()私がやりたいことと漠然と似ている関数があるのを見てきましたが、MySQL では実装されておらず、とにかく私が必要としているものではありません。

私が尋ねようとしているのは、このようなデータを選択する可能な方法を知っている人はいますか、それとも別のプログラミング言語を使用してこれを行う必要があるかどうかです。

4

2 に答える 2

1

これにより、説明した結果セットが生成されます

SELECT dname.name, 
       l1value.unit1_left, 
       l2value.unit2_left 
FROM   (SELECT DISTINCT `name` 
        FROM   table1) `DName` 
       LEFT JOIN (SELECT `name`, 
                         Max(id) id 
                  FROM   table1 
                  WHERE  unit1_left IS NOT NULL 
                  GROUP  BY `name`) l1 
              ON dname.`name` = l1.`name` 
       LEFT JOIN table1 l1value 
              ON l1.id = l1value.id 
       LEFT JOIN (SELECT `name`, 
                         Max(id) id 
                  FROM   table1 
                  WHERE  unit2_left IS NOT NULL 
                  GROUP  BY `name`) l2 
              ON dname.`name` = l2.`name` 
       LEFT JOIN table1 l2value 
              ON l2.id = l2value.id ;

デモ

unit1_left と unit2_left (l1 と l2) の両方の null 以外の値の最大 ID に 2 つのインライン ビューを作成することによってそれを行いました。次に、元のテーブルに結合して値 (l1value と l2value) を取得します。次に、個別の名前を作成する 3 番目のインライン ビュー (dname) に結合します。

それは非常に厄介で、データをより賢明な方法で保持することだけがより理にかなっているかもしれません.

于 2012-07-16T18:16:15.683 に答える
0

selectステートメントでサブクエリを使用できます。SqlFidlleを使用して、私はこれを思いついた。

select o.name,
      (select o2.Unit1_left 
         from original as o2
         where o.name = o2.name
             and o2.Unit1_left is not null
         order by o2.id desc
         LIMIT 1) as Unit1_left,
      (select o3.Unit2_left 
         from original as o3
         where o.name = o3.name
             and o3.Unit2_left is not null
         order by o3.id desc
         LIMIT 1) as Unit2_left
    from original as o 
       group by o.name
       order by id;
于 2012-07-16T18:20:02.553 に答える