SQLの最大値取得に関する問題

このQ&Aのポイント
  • SQLの最大値取得に関する問題について教えてください。
  • 指定のSQL文に最大値取得の条件を追加したところ、一部のデータが表示されなくなりました。
  • 差異の原因がわからず困っています。ご教授いただけないでしょうか?
回答を見る
  • ベストアンサー

よければ教えて頂きたいです。

先ほど教えて頂いた 'SELECT kid,id,name,day,tday FROM em WHERE kid='.$_SESSION["kid"].' AND (name,day) IN (SELECT name,MAX(day) FROM em GROUP BY name)'; だと正常に表示されましたが指摘通り最大値が同じ日があれば二つ表示されるのを防ぐためスタート時間も加えてみました。 'SELECT kid,id,name,day,tday,st FROM em WHERE kid='.$_SESSION["kid"].' AND (name,day,st) IN (SELECT name,MAX(day),MAX(st) FROM em GROUP BY name)'; stという部分です。これを加えたところ、一つの名前が表示されなくなりました。 表示されなくなったデータと他のデータを比べても差異がないので、原因がよくわからないのですが、。。

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

あ、前回の回答は正確ではなかったですね ただしくは SELECT kid,id,name,day,tday FROM em WHERE (kid,name,day) IN (SELECT kid,name,MAX(day) FROM em where kid=$_SESSION["kid"] GROUP BY name) そしてdayのmaxがかぶる場合にstの最大値をとるのであれば こんな感じでしょうか SELECT kid,id,name,day,tday,st FROM em WHERE (kid,name,day,st) IN (SELECT kid,name,day,max(st) FROM em WHERE (kid,name,day) IN (SELECT kid,name,MAX(day) FROM em where kid=$_SESSION["kid"] GROUP BY name) group by name)

drmada
質問者

お礼

うまくいきました。いつも丁寧な回答ありがとうございます。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> SELECT name,MAX(day),MAX(st) FROM em GROUP BY name 上記SQLですと、最大値が同じ日の最大スタート時間のレコードは取得できないので、以下の目的は果たせないのではないかと。 > 最大値が同じ日があれば二つ表示されるのを防ぐためスタート時間も加えてみました。

関連するQ&A

  • サブクエリに関して()

    $sql2 = 'SELECT ki,id,name,day,tday,st FROM tim WHERE (ki,name,day,st) IN (SELECT ki,name,day,max(st) FROM tim WHERE (ki,name,day) IN (SELECT ki,name,MAX(day) FROM tim where ki='.$_SESSION['ki'].' GROUP BY id) group by id)' ; IDごとにカラムday,stの最大値を出力するもです。(以前おしえていただきました) これに更にsvの最大値も条件にいれたい場合どうしたらいいでしょうか?;

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

    • 締切済み
    • PHP
  • SQLがわからないです

    kid | id | name | day | tday | 1 | 1 | 松 | 25 | 1 | 2 | 谷  | 15 | このようなデータがあったとして、それぞれのMAX(day)を出力する場合どうしたらいいでしょうか?? $sql2 = 'SELECT kid,id,name,MAX(day),tday FROM em WHERE kid='.$_SESSION["kid"].'' ; これだと松さんのデータしか出力されないし、MAXを外すと、例えば松さんのデータが二個あり出力した場合、松(25)松(18)谷(15)と出力されてしまいます。 希望は 松(25)谷(15) それぞれの最大値です。

    • ベストアンサー
    • MySQL
  • ★年度ごとに情報を一覧表示

    各情報を、年度ごとに表示したいと考えています。 基となる年度の条件指定方法が分かりません。 (????と記述しているところです。) 各サブクエリは、年度ごとに情報がない時もあります。 select ????,1tbl.day ,2tbl.day ,3tbl.day from  (select nen,max(day) from 1tbl  where nen < '2006' and nen > '2001'  group by nen  order by nen desc ) 1tbl,  (select nen,max(day) from 2tbl  where nen < '2006' and nen > '2001'  group by nen  order by nen desc ) 2tbl,  (select nen,max(day) from 3tbl  where nen < '2006' and nen > '2001'  group by nen  order by nen desc ) 3tbl where ???? 各サブクエリの情報 1tbl-------2tbl------3tbl------- nen--day----nen--day----nen--day--- 2005-2005/12/12-2005-2005/12/13--------- ---------2004-2004/11/10-2004-2004/12/30 2002-2002/09/01------------------ 表示 nen--1day-----2day-----3day--- 2006-------------------- 2005-2005/12/12--2005/12/13------- 2004--------2004/11/10--2004/12/30 2003-------------------- 2002-2002/09/01-------------- 2001-------------------- ↑上記のように表示したいと考えています。 この形で取れるSQLの書き方はあるでしょうか。 (2006年や2003年のように、情報が0件のところは取れなくてもいいです。) サブクエリ部分をばらばらでSQL発行すれば済む話なのですが、 一度に取れる方法は無いのか気になりまして。 (年度のみのテーブルはありません。) よろしくお願いします。

  • mysql 部分一致+ユニーク指定+最新 を表示

    mysql初心者です。 検索語句(search)で部分一致するものを、名前(name)と更新日(update)でユニーク指定し、修正日(time)が最新のものだけを表示させたいのですが、望む結果が得られません…。  SELECT * FROM db WHERE name LIKE \"%{$search}%\" GROUP BY name,update までは正しいと思うのですが、さらにtimeの最新を指定する方法を教えていただけませんか? よろしくお願いします。 いろいろ探して試行錯誤し、以下に行きついたのですが、部分一致がうまく機能しない時があります。(情報不足などあればご指摘ください。) SELECT * FROM db where (time) in (SELECT MAX(time) FROM db WHERE name LIKE \"%{$search}%\" GROUP BY name,update) (中略・件数を取得しページャーに使っています) SELECT * FROM db where (time) in (SELECT MAX(time) FROM db WHERE name LIKE \"%{$search}%\" GROUP BY name,update) ORDER BY time DESC LIMIT $start,10 (中略・whileとmysql_fetch_arrayで表示させています)

    • ベストアンサー
    • MySQL
  • GROUPBY ORDER BY

    idの大きい順から並べたいのですがうまくいきません 調べて サブクエリなどを使い実行しましたがうまくいきませんでした ご教授お願いいたします ソース $sql='SELECT memberid,mailid,max(name),max(day) FROM messageall WHERE mailid=? GROUP BY memberid ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset; サブクエリでも試しましたが正直 ソースがめちゃくちゃでデータが表示されませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • mysql order by のNULLについて

    mysql order by のNULLについて テーブル tb1 memberid 2   2 cardid  1   1 name 田中  井岡 day 2016.4.10  2016.4.22 new  New NULL ソース SELECT memberid,cardid,max(name),max(day),max(new) FROM tb1 WHERE memberid=2 GROUP BY cardid ORDER BY max(day) DESC LIMIT '.$limit.' OFFSET '.$offset; すると max(new)の部分が Newと出てきます。 max(new)なのでNULLが出てくると思っていました。 NULLにしたいのですが 名前も井岡ではなく田中がでてきます max(day)をオーダーしているので新しい日の情報が出てくると思っていましたが。。。。 何か SQLの書き方に問題があるのでしょうか それともこのテーブルの作りでは不可能なのでしょうか? 無知な私に ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • mysql

    $sql='SELECT id,kaisyamei, max(day),namae FROM message WHERE memberid=? GROUP BY id LIMIT '.$limit.' OFFSET '.$offset; どこか違いますか?

    • ベストアンサー
    • MySQL
  • sqlのテーブル名省略について

    内部SQLで使用している「employee」表を「emp」とし、内部SQL実行結果を「emp」としています。 この場合、大外のSQLで使用している「emp」は、「emploheeを指すemp」か、「内部SQL実行結果を指すemp」なのかわかりません。 ご教授よろしくお願いします。 select emp.name,   emp.year, emp.day from (select name, year, day from employee emp where ~ GROUP BY name, year, day) emp where ~ GROUP BY emp.name, emp.year, emp.da /

専門家に質問してみよう