こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

サブクエリの使い方

Table t1には
t1code|t1type
------------------
花子|1
太郎|1
一郎|2
次郎|2
五郎|2

Table t2には
t2code|date
-----------------
太郎|2012-05-30
太郎|2012-05-30
花子|2012-05-10
花子|2012-05-10
次郎|2012-03-20
五郎|2012-04-10
一郎|2012-03-01

と登録されている場合に
t1type毎に一番新しいdateをもつt2codeを抽出したいのです。
そこで、
select t2code,max(date)
from t1 inner join t2 on t1code = t2code
where (t2code,date) in
(select t2code,max(date) as d from t2 group by t2code)
group by t1type

としたところ、
+--------+------------+
| t2code | max(date) |
+--------+------------+
| 太郎 | 2012-05-30 |
| 次郎 | 2012-04-10 |
+--------+------------+
となります。
本来は、次郎→五郎になってほしいのですが、
どこが悪いのでしょうか?

よろしくお願いします。

投稿日時 - 2012-09-01 15:23:32

QNo.7675003

すぐに回答ほしいです

質問者が選んだベストアンサー

SELECT DISTINCT t2_code,date
FROM t1 INNER JOIN t2 ON t1_code=t2_code
WHERE (t1_type,date) IN(SELECT t1_type,MAX(date)
FROM t1 INNER JOIN t2 ON t1_code=t2_code
GROUP BY t1_type)
でどうでしょうか。

投稿日時 - 2012-09-01 17:42:24

補足

ありがとうございます。
うまく行きました。

サブクエリがなんとなく理解できそうです。

投稿日時 - 2012-09-01 23:27:49

お礼

すみません。
このサイトの使い方がいまいちわかってなくて、補足に書いてしまいました。
ありがとうございます。

投稿日時 - 2012-09-01 23:37:22

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

かなり冗長ですが、下記の様なSQLでご希望の結果が出ると思います。

SELECT DISTINCT t21.*
FROM t1 t11 INNER JOIN t2 t21 ON t1code = t2code
WHERE NOT EXISTS (
SELECT * FROM t1 t12 INNER JOIN t2 t22 ON t1code = t2code
WHERE t11.t1type = t12.t1type AND t21.date < t22.date
)

結合したデータ中で t1type が同じで date が自分より後のものが無いものだけに絞り込んでいます。
太郎と花子には、同一の date のデータが存在するので DISTINCT で重複を消しています。


> どこが悪いのでしょうか?

t1type でグループ化して t2code を出力していますが、MySQL では GROUP BY で指定されていない項目を SELECT句に指定すると同じグループの中に存在する値の中のどれかになります。(下記ページ参照)
http://dev.mysql.com/doc/refman/5.1/ja/group-by-hidden-fields.html
ですから、t2code は t1code が同じものの中の『何か』になってしまいます。

参考URL:http://gihyo.jp/dev/serial/01/sql_academy2/000902

投稿日時 - 2012-09-01 17:06:17

補足

こちらでもうまく行きました。
しかし、理解するのに時間がかかりそうです。
NOT EXISTS.....
又、新しい課題が.....
じっくり勉強させて頂きます。

>GROUP BY で指定されていない項目を
>SELECT句に指定すると同じグループの
>中に存在する値の中のどれかになります

なるほどです。
どうもありがとうございました。

投稿日時 - 2012-09-01 23:34:35

お礼

すみません。
補足に書いてしまいました。
ありがとうございます。

投稿日時 - 2012-09-01 23:36:21

あなたにオススメの質問