質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

5回答

17986閲覧

GROUP BYよりもORDER BYを優先したい

inari1973

総合スコア35

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2019/02/08 10:53

編集2019/02/08 11:01

GROUP BYよりもORDER BYを優先したいです。サブクエリを使っても上手く動きません。どうすれば良いでしょうか。

~日付が新しい順にグループでまとめたい。~

グループ日付
12018-1-1
22018-1-2
12018-1-3

グループ日付
12018-1-3
22018-1-2
mysqli_query($db,"SELECT * FROM (SELECT * FROM 表 ORDER BY 日付 DESC) AS temp1 GROUP BY グループ);

※このように書いても「ORDER BY 日付 DESC」が効かない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/02/08 11:26

やりたいことは、同じidを持つもののうち日付の新しいものを一つずつとる、では?
inari1973

2019/02/08 11:32 編集

distinctを使って重複する行をまとめることも試しましたが日付が古い順になってしまいました。 「同じidを持つもののうち日付の新しいものを一つずつとる」でも目的は達成できます。
guest

回答5

0

ベストアンサー

group byとorder by は併用できますよ。

SQL

1SELECT グループ, max(日付) as 日付1 2FROM3GROUP BY グループ 4order by max(日付)

とか

SQL

1SELECT グループ, max(日付) as 日付1 2FROM3GROUP BY グループ 4order by 2

※order by での数字はselect している項目の左からの項目位置

投稿2019/02/08 12:46

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inari1973

2019/02/08 13:43

lazybones2000さんのやり方で動いたのですが、私がつまったのは「order by 日付」では動かず「order by 名前」で動くという部分に気づかなかったことでした。 今後、同じようにつまってしまう方のために、「order by 日付」ではなく「order by max(日付)」で動くということが一目で分かるように書いてあるsaziさんを恐縮ながらベストアンサーにさせていただきました。 また、order by 2で動くという説明も視野が広がるため、初心者には役立つものだと感じました。 lazybones2000さん、algさん、saziさんありがとうございました。
sazi

2019/02/08 14:45

order by などでエイリアスでの名称を指定できるのは、MySqlなどの一部のDBMSです。
guest

0

こんな感じですかねぇ。

sql

1select 2 グループ, 3 max(日付) 日付1 4from 56group by グループ 7order by 日付1 desc;

動作サンプル
http://sqlfiddle.com/#!9/dc4553/1

あれ、よく見たらlazybones2000さんとほぼ同じクエリでした。

投稿2019/02/08 12:42

alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

グループでgroupにして、日付の最大値を取りたいように見えます。

であれば、こんな感じになるのでは?

SQL

1select グループ, max(日付) as 日付1 fromgroup by グループ order by 日付1:

動作確認しないままの投稿ですが。

投稿2019/02/08 11:36

編集2019/02/08 12:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inari1973

2019/02/08 12:12 編集

その方法も試しましたが期待するような挙動は得られませんでした。MAXが効かず日付順ではなく表の順になってしまいます。日付がdate型ではなくintになっているからMAXが効かないとか・・。でも日付にORDER BYは効きます。
退会済みユーザー

退会済みユーザー

2019/02/08 12:14

すみません、スマホ参照で要件の見落としとか、タイポとかしていたのを修正しました。どうでしょうか。
inari1973

2019/02/08 12:34

何度もご返答いただきありがとうございます。色々試しましたが、そもそもMAXがきちんと動いてくれないようです。原因は不明ですが、調べてから改めて連絡します。
guest

0

そもそも、GROUP BY は COUNT, MAX, MIN, SUM などのグループ関数とセットで使います。
通常、[グループ]毎にあるカラムをSUM & GROUP BYし、その結果を[グループ]毎にORDER BYします。

CREATE TABLE, 数件で良いから現行のデータをINSERTと希望するSELECT 結果を質問に追記しては?

投稿2019/02/08 11:02

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/02/08 11:41

SELECT グループ, MAX(日付) AS 日付 FROM 表 GROUP BY グループ ORDER BY グループ ;
inari1973

2019/02/08 11:58 編集

ご返答ありがとうございます。その方法も試しましたが日付順に並ばずにグループ順になってしまいます。 mysqli_query($db,"SELECT グループ,MAX(日付) FROM 表 GROUP BY グループ ORDER BY グループ) ;
Orlofsky

2019/02/08 12:36

やはり、CREATE TABLEとINSERTを質問に載せては?
Orlofsky

2019/02/08 12:38

>(日付) カッコは半角文字で。全角文字になっていてはダメです。 テキストエディタを使って、きちんとコピペする習慣を身に着けてください。
guest

0

そもそも集計関数を使わないgroup byはありえません
具体的なサンプルデータと期待する結果を例示することをお勧めします

投稿2019/02/08 10:55

yambejp

総合スコア114837

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問