新しく質問する

MYSQLに関してです

役に立った:0件
  • 質問者:drmada
  • 投稿日時:2012/05/26 15:59
  • 困り度:すぐに回答が欲しいです
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

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

この質問に回答する
このQ&Aは役に立ちましたか?(役に立った:0件)

回答(2件)

  • 参考になった:0件
  • 回答者:root139
  • 回答日時:2012/05/26 18:55

> この場合、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- …

ちなみに少し前のバージョンの 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句に書かれた方が良いでしょう。

通報する

  • 参考になった:0件
  • 回答者:shimix
  • 回答日時:2012/05/26 18:02

結合条件がないですね。両方のテーブルの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は役に立ちましたか?(役に立った:0件)

このページのトップへ

Facebook公式ページ

公式Twitter