質問: SELECT * FROM table WHERE 'ID'=1111 GROUP BY '日付' HAVING '修正'=MAX('修正')";** しかし,このSQLだと「20170202」と「20170404」の行しか取得されませんでした. この他にもSQL文を書きましたが,エラーを出さずに希望する結果に最も近いSQL文が上記のもの でした. そこで,皆さんにSQL文の書き方のご教授を頂きたく思います. お返事いただけると幸いです. お忙しいところ申し訳ございませんがよろしくお願い致します.
回答: そのSQLだとエラーになると思いますが。 table は予約語なのでそのままではエラーになる。 GROUP BY がある場合は、* は使えない。 フィールド名を'シングルクォーテーションで囲んだらあかん。 など。 下記の考え方で。 GROUP BY を使って ID, 日付 毎の修正の最大を取得する。 それと元のテーブルを内部結合する。 ``` SELECT a.* FROM `table` a INNER JOIN (SELECT ID, 日付, MAX(修正) AS MAX_修正 FROM `table` GROUP BY ID, 日付) b ON a.ID = b.ID AND a.日付=b.日付 AND a.修正 = b.MAX_修正; ``` **動作確認サンプル** (MySQL) | ブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IO