• 締切済み

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 と本来の組み合わせで表示したいです。

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.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句に書かれた方が良いでしょう。

すると、全ての回答が全文表示されます。
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.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 これ、ちゃんと何らかのキーで結合可能なのですか?単に「そういう順番になっている」だけってことじゃないですよね?

すると、全ての回答が全文表示されます。

関連するQ&A