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
と本来の組み合わせで表示したいです。
> この場合、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句に書かれた方が良いでしょう。
結合条件がないですね。両方のテーブルの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
これ、ちゃんと何らかのキーで結合可能なのですか?単に「そういう順番になっている」だけってことじゃないですよね?
- 最新から表示
- |
- 回答順に表示