- ベストアンサー
1列について重複行を除いて全列をSELECTするSQL文
A B C 1 2 10-01 2 3 10-01 3 2 10-02 4 1 10-03 5 3 10-04 MYSQLで上のようなTABLEから、B列についてCが最新の日付の行を1行ずつ、且つ全列抽出したいです。想定する結果は下記の通りです。 3 2 10-02 4 1 10-03 5 3 10-04 SELECT DISTINCT A FROM table_name ORDER BY C DESC だとB,C列は抽出されず、DIATINCT A,B,Cだと全行抽出されてしまう。 GROUP BY B は平均や集計なら使えるでしょうが最新の1行でないし。 どんなSQL文にすれば良いのでしょうか。よろしくお願いします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
(1)MySQL バージョン5.0以降 まだ開発中バージョンですが、サブクエリがサポートされています。 SELECT * FROM table_name WHERE (B,C) IN(SELECT B,MAX(C) FROM table_name GROUP BY B); (2)MySQL バージョン5.0より前 B列の値毎の最新日付を、一旦、テンポラリテーブル(*1)に格納する方法を示します。 (a)テンポラリテーブルの定義 CREATE TEMPORARY TABLE w_tbl(B B列のデータ型,C C列のデータ型); (b)操作 INSERT INTO w_tbl(B,C) SELECT B,MAX(C) FROM table_name GROUP BY B; SELECT x.A,x.B,x.C FROM table_name AS x,w_tbl AS y WHERE x.B=y.B AND x.C=y.C; *1 MySQL バージョン 3.23 以降では、テーブルの作成時に TEMPORARY キーワードを指定することができます。テンポラリテーブルは現在の接続の間のみ有効で、接続が閉じると自動で削除されます。
その他の回答 (1)
- moon_night
- ベストアンサー率32% (598/1831)
こんな感じで。 SELECT SUBSTRING( MAX( CONCAT(c,a) ), 6) AS 'a' ,SUBSTRING( MAX( CONCAT(c,b) ), 6) AS 'b2',MAX(c) AS 'c' FROM table_name GROUP BY b order by a;
お礼
ありがとうございました
補足
ご回答ありがとうございます。なるほど、結合させてMAXとって後ろだけ使う、ですか。全く思いつかなかったですw(゜o゜)wただもし長さが変なcが混ざってた場合のa,bの抽出が心配な気もします。6はその長さのことですよね? あと下記訂正です。 >SELECT DISTINCT A FROM table_name ORDER BY C DESCだとB,C列は抽出されず[誤] ⇒SELECT DISTINCT B FROM table_name ORDER BY C DESCだとA,C列は・・・[正]
お礼
お礼が遅くなりすみませんでした。 テンポラリテーブルという方法があったのですね。 残念ながらご回答頂いた時は既に作成済でした(バージョン5.0より前でサブクエリは使えず結局SQL2度発行にしました)ので次の機会に是非参考にさせて頂きます。 丁寧なご説明ありがとうございました。