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

締切り済みの質問

MYSQLに関してです

SELECT a.kid,a.id,a.name,b.kid,b.id,b.name,MAX(b.day),b.tday FROM me AS a, mem AS b WHERE a.kid='.$_SESSION["kid"].' and a.kid=b.kid and a.id=b.id group by a.id

このような文を書いてます。
この場合、MAX(b.day)のデータを取得しているわけですが、tday部分が空であるのに他のレコードから違うtdayの情報を取得してしまい困っています。どうしたらいいでしょうか??

分かりやすく書くと

データベース内には
day tday
5 2
2
8

と入ってるとして上記のSQL文を命令後は
day tday
8 2

と入ってしまっていますが私は
day tday
8
と本来の組み合わせで表示したいです。

投稿日時 - 2012-05-26 15:59:43

QNo.7497265

すぐに回答ほしいです

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

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

回答(2)

ANo.2

> この場合、MAX(b.day)のデータを取得しているわけですが、

SQLの意味としては、そうはなりません。
GROUP BY で指定されているのは a.id だけですので、a.id と MAX(b.day) 以外の項目は、a.id が同じものの中のどれかになります。(下記ページ参照)
http://dev.mysql.com/doc/refman/5.1/ja/group-by-hidden-fields.html

ちなみに少し前のバージョンの PostgreSQL などでは、GROUP BY 句に現れないカラムを SELECT 句に指定するとエラーになりました。


期待される結果を得るには、サブクエリでdayの最大値を取得しそれを選択条件に加える(例1)、あるいは、同一id,kidでそれ以上大きいdayを持つレコードが存在しないという条件を加えてやれば(例2)良いでしょう。

例1) -----------------------------------
SELECT a.kid, a.id, a.name, b.kid, b.id, b.name, b.day, b.tday
FROM me AS a, mem AS b
WHERE
a.kid = '.$_SESSION["kid"].' AND a.kid = b.kid AND a.id = b.id AND
b.day = (SELECT MAX(c.day) FROM mem c WHERE a.kid = c.kid AND a.id = c.id)
----------------------------------------

例2) -----------------------------------
SELECT a.kid, a.id, a.name, b.kid, b.id, b.name, b.day, b.tday
FROM me AS a, mem AS b
WHERE
a.kid = '.$_SESSION["kid"].' AND a.kid = b.kid AND a.id = b.id AND
NOT EXISTS (SELECT * FROM mem c WHERE a.kid = c.kid AND a.id = c.id AND b.day < c.day)
----------------------------------------

なお、このケースではWHERE句に結合条件を書いても大丈夫ですが、#1さんが言うように結合条件は基本的にFROM句に書かれた方が良いでしょう。

投稿日時 - 2012-05-26 18:55:04

ANo.1

結合条件がないですね。両方のテーブルのidが同じレコードで取り出すならwhereに書くのではなく

SELECT a.kid,a.id,a.name,b.kid,b.id,b.name,MAX(b.day),b.tday FROM me AS a inner join mem AS b on me.id = mem.id WHERE a.kid='.$_SESSION["kid"].' and a.kid=b.kid group by a.id

ですよね。

それでもwhereにa.id=b.idがあるのに、余計な組み合わせが引っ張られてくるのなら、そもそも

>データベース内には
>day tday
>5 2
>2
>8

これ、ちゃんと何らかのキーで結合可能なのですか?単に「そういう順番になっている」だけってことじゃないですよね?

投稿日時 - 2012-05-26 18:02:03