MySQLのorder byのNULLについて

このQ&Aのポイント
  • テーブルtb1で、memberidが2の場合にcardidをグループ化し、最新の情報を取得するクエリを実行しています。
  • しかし、max(new)の部分でNULLではなくNewと表示されています。
  • また、max(day)をorder byしているので、新しい日の情報を取得できると思っていましたが、田中の情報が表示されます。SQLの書き方に問題があるのでしょうか?
回答を見る
  • ベストアンサー

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
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • kreikg
  • ベストアンサー率39% (21/53)
回答No.3

例えばmemberid=1 cardid=1の組み合わせのすべてのデータから最新のdayを持った1件、memberid=1 cardid=2の組み合わせのすべてのデータから最新のdayを持った1件など、それぞれの組み合わせの最新が1件ずつ欲しいということですか? SELECT * FROM (SELECT * FROM tb1 ORDER BY day DESC) tbl GROUP BY memberid,cardid これはFROMの後にSELECTがまたありますね。()の中で日付が大きい順に並べ替えたテーブルを作り、それを「tbl」と命名してそのテーブルに対してグルーピングをかけています。

a7a7a77a7a74
質問者

お礼

できました!! 私の説明がわかりにくく申し訳ないです しかし それをご理解していただき迅速に回答してくださって誠に ありがとうございました。

その他の回答 (2)

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.2

select * from tb1 where (cardid,day) in ( select cardid,max(day) from tb1 where memberid=2 group by cardid) これでいかがですか?

a7a7a77a7a74
質問者

お礼

回答ありがとうございます。 無事解決いたしました。 これからもよろしくおねがいいたします。

  • kreikg
  • ベストアンサー率39% (21/53)
回答No.1

そのSQLで何を出したいのかがよくわからないのですが、一番新しいdayを持った1件のデータを取得したいのですか? それなら下記ででませんか? SELECT * FROM tb1 ORDER BY day DESC LIMIT 1

a7a7a77a7a74
質問者

お礼

早速の回答ありがとうございます! ほかにもデータがはいっておりまして memberid 5 cardid 1など たくさん組み合わせがありまして それらのグループ化した 最大のdayのデータを表示したい次第です。

関連するQ&A

  • 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

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

    • ベストアンサー
    • MySQL
  • order byで並び変えし最大値の項目の抽出方法ついて

    すみません。 order byで並び変えし最大値の項目のみ一意で抽出したいのですが 、 SELECT * from ta order by no,date1,date2; no | date1 | date2 ----+-------+------- 11 | 2008 | 0501 11 | 2008 | 0502 11 | 2008 | 0502 11 | 2008 | 0503 12 | 2008 | 0501 12 | 2008 | 0502 12 | 2008 | 0503 13 | 2008 | 0501 13 | 2008 | 0502 13 | 2008 | 0503 14 | 2008 | 0501 とあった場合、 no,date1,date2のorder by順番で並び変えし 11 | 2008 | 0503 12 | 2008 | 0503 13 | 2008 | 0503 14 | 2008 | 0501 とno項目に対し一つずつだけ出力したい場合どのようにしたらよいのでしょうか? LIMITとoffsetだと1項目分しか出力されず困っております。 SELECT * from ta where no in (select no from ta group by no limit 1 offset 0) order by no,date1 desc,date2 desc limit 1; 宜しくお願い致します。

  • sql エラー

    エラーが出ます。どこかおかしな点はありますでしょうか。 エラー文 Call to a member function prepare() on a non-object ソース $page = 1; $limit = 2; $offset = $limit * ($page - 1); $sql='SELECT COUNT(*) FROM message WHERE memberid=? GROUP BY aid'; $stmt=$dbh->prepare($sql); $data[]=$memberid; var_dump($data); $stmt->execute($data); $dbh=null; $total=$stmt->fetchColumn(); $lastpage= ceil($total/$limit); $sql='SELECT aid,max(kaisyamei),max(day) FROM message WHERE memberid=? GROUP BY aid LIMIT '.$limit.' OFFSET '.$offset; $stmt=$dbh->prepare($sql); $stmt->execute($data); $dbh=null; ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • GROUP BY/ORDER BYの併用で期待するORDERが得られま

    GROUP BY/ORDER BYの併用で期待するORDERが得られません。 データベース初心者です。よろしくお願いいたします。 table id group_id name 1 1 冷蔵庫1 2 2 カメラ1 3 2 カメラ2 4 2 カメラ3 5 3 テレビ1 のようなテーブルを、group_idでグループ化し、idの大きい順に並べた以下のようなデータ id group_id name 5 3 テレビ1 4 2 カメラ3 1 1 冷蔵庫1 を取得しようとして悩んでおります。 SELECT MAX(id) AS max_id, id, group_id, name FROM table GROUP BY group_id ORDER BY max_id DESC というクエリですと max_id id group_id name 5 5 3 テレビ1 4 x 2 y 1 1 1 冷蔵庫1 という結果が得られますが、xとyところが、期待するx=4、y=カメラ3とならないケースがあります。 いくつかのテーブルで試しましたが、期待する結果になるものとならないものがありました。 例えばこれを自己結合することも考えたのですが、WHERE句にASで命名した「max_id」が含まれると「max_idが不明」というエラーが出ます。 MySQLのバージョンは4.0.xでして、サブクエリーが使えません。 このような状況で、何か方法がございましたらご教授のほどお願い申し上げます。 「期待する結果がクエリ1回で得られない」ということを知れるだけでも構いません。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLで、NULLか空の判定について

    下記のSQL文は、間違っていると思われます。 MySQLをJAVAでコーディングしています。 やりたいことは、 1)food_textが、NULLか、空っぽの時に、 2)limit_dateが最大の 3)レコード1件を抽出したいのです。 SELECT Id, food_id FROM foods   WHERE    (kind_id = 1)  AND (food_text IS NULL) AND (DATALENGTH(food_text) <= 0)  AND (delete_flag = false)  ORDER BY limit_date DESC  LIMIT 1;

    • ベストアンサー
    • MySQL
  • 【バグ?】ORDER BY DESCでempty

    MySQLを使っていて、下記条件で結果がemptyになります。 どうすれば正常に取得できるようになるでしょうか。 SELECT `hoge`, `fuga`, `piyo` FROM `table` WHERE `moge` = 'moge' ORDER BY `fuga` DESC LIMIT 0, 5 ・`moge`と`piyo`にはインデックスが貼られています。 ・DESCを消すと正常に取得できます。 ・WHERE句を消すと正常に取得できます。 ・LIMITの数値を大きくすると正常に取得できます。('moge'によってどれくらい大きくすればいいかの数値は違う) ・LIMITのoffsetを1以上にすると正常に取得できます。 1ヶ月ほどはちゃんと動作していたのですが、`fuga`をUPDATEしたタイミングからこのような現象となりました。 環境 ・Ubuntu 12.04.1 LTS ・MySQL 5.5.28 ・エンジン mroonga ・groongaのバージョン2.0.9 足りない情報があれば補足致します。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • MySQLで最小値

    次の様な連番が入ったseqというフィールドがあります。 => select seq from hoge order by seq desc; seq ----- 427 426 425 424 423 422 421 420 419 418 (10 rows) これにlimit 5とすると次の様にな結果になります。 => select seq from hoge order by seq desc limit 5; seq ----- 427 426 425 424 423 (5 rows) このlimit 5で表示された結果の最小値(423)を取得したいのですが 上手くいきません。(わかりません) min(seq)を試してみたのですが418が返ってきてしまいます。 => select min(seq) from hoge order by seq desc limit 5; min ----- 418 (1 rows) limitで表示された結果の最小値(423)を とる事はできるのでしょうか? どうぞ宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • SQLコマンドのorder by句

    受注金額の大きい順にリストするために select 受注番号,受注金額 from 受注テーブル order by 受注金額 desc; を発行すると、受注金額(数値型)が未定義(null)のものが上位になってしまします。 受注金額がnullのものを零より小さい扱いでリストする方法を教えて下さい。 尚、・・・ where 受注金額 is not null は不可です。 宜しくお願いします。

  • sql offset

    offsetやlimitをつけると 結果が表示されなくなります。 $sql='SELECT naiyo FROM zyoho WHERE cityid=? OR brandid=? だけのSQLだと結果は表示されるのですが。 解決方法をご教授お願いいたします。 下記はソースです。 $page=1; $limit=2; $offset = $limit * ($page - 1); $lastpage = ceil($total / $limit); if($brandid=='') { $sql='SELECT naiyo FROM zyoho WHERE cityid=? OR brandid=? ORDER BY `code` DESC LIMIT'.$limit.' OFFSET '.$offset.''; }else{ $sql='SELECT naiyo FROM zyoho WHERE cityid=? AND brandid=?ORDER BY `code` DESC LIMIT'.$limit.' OFFSET '.$offset.''; } $stmt=$dbh->prepare($sql); $data[]=$cityid; $data[]=$brandid; $stmt->execute($data); $dbh = null;

    • ベストアンサー
    • MySQL