アプリ版:「スタンプのみでお礼する」機能のリリースについて

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文にすれば良いのでしょうか。よろしくお願いします

A 回答 (2件)

こんな感じで。



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列は・・・[正]

補足日時:2005/10/26 01:40
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2005/11/28 20:55

(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 キーワードを指定することができます。テンポラリテーブルは現在の接続の間のみ有効で、接続が閉じると自動で削除されます。
    • good
    • 1
この回答へのお礼

お礼が遅くなりすみませんでした。
テンポラリテーブルという方法があったのですね。
残念ながらご回答頂いた時は既に作成済でした(バージョン5.0より前でサブクエリは使えず結局SQL2度発行にしました)ので次の機会に是非参考にさせて頂きます。
丁寧なご説明ありがとうございました。

お礼日時:2005/11/28 20:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す