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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

197閲覧

SQLのソートについての質問です。

konpei_konpei

総合スコア20

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/07/27 09:54

idteltime
1080000011112017-07-01
2080111122222017-07-02
3080222233332017-07-03
4080333344442017-07-04
5080000011112017-07-05
6080555566662017-07-06

といったテーブルがあったとして

idteltime
6080555566662017-07-06
5080000011112017-07-05
4080333344442017-07-04
3080222233332017-07-03
2080111122222017-07-02
1080000011112017-07-01

日付の新しい順には並べ替えることはできました。

SQL

1SELECT * FROM `list` ORDER BY `time` DESC; 2

しかしこういった事はできるのでしょうか?

idteltime
6080555566662017-07-06
5080000011112017-07-05
1080000011112017-07-01
4080333344442017-07-04
3080222233332017-07-03
2080111122222017-07-02

内容としては日付が新しい順であるがもし同じ電話番号があった場合はそちらを表示し次に進んでいくといった形です。
できる限りテーブルやカラムを増やさずに実行できるSQL文はありますでしょうか?
ご回答宜しくお願い致します。

環境
phpMyAdmin のバージョン: 4.6.6
PHP のバージョン: 5.6.30

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

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

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

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

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

guest

回答4

0

お望みの結果は、きっとこちら。

SQL

1-- サンプルデータ 2drop table IF EXISTS tbl; 3create table IF NOT EXISTS tbl( 4id int not null unique 5,tel varchar(20) 6,time date 7,KEY IX_tbl(tel,time) 8,KEY IX_tbl2(time) 9); 10insert into tbl(id,tel,time) values 11(1,'08000001111','2017-07-01'), 12(2,'08011112222','2017-07-02'), 13(3,'08022223333','2017-07-03'), 14(4,'08022223333','2017-07-03'), 15(5,'08022223333','2017-07-05'), 16(6,'08033334444','2017-07-04'), 17(7,'08000001111','2017-07-05'), 18(8,'08000001111','2017-07-05'), 19(9,'08055556666','2017-07-06'), 20(10,'08000001111','2017-06-30');

SQL

1SELECT T1.id 2 , T1.tel 3 , T1.time 4-- , T3.maxtime 必要に応じて追加 5FROM tbl T1 -- ソート対象となるtblデータ 6 INNER JOIN 7 -- T1に対して、ソート用の項目をJOINするべく、tel毎のソート項目を抽出する 8 ( 9 SELECT T2.tel 10 , concat( MIN(T2.id), T2.tel ) AS telsort 11 , MAX(T2.time) AS maxtime 12 FROM tbl T2 13 GROUP BY T2.tel -- T1とT3が1:1となるように、TELで集約 14 ) T3 ON( 15 T3.tel = T1.tel 16 ) 17-- WHERE T1.time >= DATE_FORMAT(( NOW() - INTERVAL 1 MONTH ), '%Y-%m-%d' ) 必要に応じて追加 18ORDER BY T3.maxtime DESC 19 , T3.telsort 20 , T1.time DESC 21 , T1.id 22;

投稿2017/07/27 14:18

編集2017/07/27 18:01
tomari_perform

総合スコア760

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

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

konpei_konpei

2017/07/27 17:30

ご回答ありがとうございます。 今回の質問によりt1等が出てきたことによりエイリアス(別名)といったものの存在を初めて知りました! 調べて見ましたがいまいちピンとこなく今回の質問の回答の文が理解することができませんでした。 なので次はそちらについて質問をさせていただこうと思います!
tomari_perform

2017/07/27 18:06 編集

(たとえば)1つのSQLの中に同一テーブルを複数指定する場合、 どのテーブルのどの項目か分かりやすいように、別名を付けたりします。 回答のSQLの解析結果を上記回答のSQL文中に補足を追加しました。
tomari_perform

2017/07/27 18:06 編集

なお、私はテーブルの別名を付ける際、「AS」は付けない派(基本的に1行あたり1項目、1テーブルまでにしているため)ですが、 あまり見慣れていないのであれば、「AS」を付けていた方が分かりやすいかもしれません。
konpei_konpei

2017/07/28 04:12

ご丁寧にありがとうございます! 今そちらの知識がなくsazi様の回答との回答とどちらをBAにするかで悩んでいます。 結果的には同じですがどういった使い分けをするのかお答えいただけますでしょうか? お手数をおかけいたします。
tomari_perform

2017/07/28 04:18

テーブルの設計にもよりますが、 実行結果は微妙に違うハズですよ。 性能面であれば、 sazi様の回答の方が優れています。
tomari_perform

2017/07/28 04:22

ちなみに、抽出結果が同じでもこんなときは違う結果になる、というのを理解した方がよいです。 その上で、どんなパターンでも同じ結果になるのであれば、次に注目するのは性能面です。 それもほぼ同じなら、あとは見やすさや、好みの問題なので、動けば何でも良いです。
guest

0

ベストアンサー

こんな感じかな?

SQL

1select * 2from ( 3 select * 4 , (select max(`time`) from `list` where tel=t1.tel) as max_time 5 from `list` t1 6) iv 7ORDER BY max_time desc, tel, `time` desc;

投稿2017/07/27 12:57

編集2017/07/28 15:36
sazi

総合スコア25138

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

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

konpei_konpei

2017/07/27 17:30

ご回答ありがとうございます。 今回の質問によりt1等が出てきたことによりエイリアス(別名)といったものの存在を初めて知りました! 調べて見ましたがいまいちピンとこなく今回の質問の回答の文が理解することができませんでした。 なので次はそちらについて質問をさせていただこうと思います!
sazi

2017/07/28 00:39

回答について、私のは相関問合せによるサブクエリーで他の方はインラインビューですね。 エイリアスが必ず必要なのは自己結合(同じテーブル同士の結合)の場合で、エイリアスしないと名前が重複しエラーになる。 エイリアスよりも相関問合せやインラインビューという視点で理解をされた方が良いですね。
konpei_konpei

2017/07/28 04:11

ご丁寧にありがとうございます! 今そちらの知識がなくtomari_perform様の回答との回答とどちらをBAにするかで悩んでいます。 結果的には同じですがどういった使い分けをするのかお答えいただけますでしょうか? お手数をおかけいたします。
sazi

2017/07/28 15:41 編集

サブクエリーにするかインラインビューで行うかについては、私も性能で使い分けています。 全データに対して行うときはサブクエリーは使いません。 抽出条件があり全体に対して少ない比率で抽出するようなものは、サブクエリーが高速である場合が多いです。 概ね抽出条件があることの方が多いので、先ずはサブクエリーで記述することが多いですね。 とは言え、実行計画でコストを確認しつつインデックスを追加したりし、高速なものにチューニングするので、最終的には当初に作成したSQLとは異なるものになったりします。 ※これらはSQLチューニングと呼ばれます。 どちらを採用するかは実際のデータで検証できる質問者様が決めるしかないですね。 ※具体的なデータ数やインデックスなどの詳細な情報が提示されればまた別ですけれども。
guest

0

これでどうでしょう。

  1. tel毎のtimeとidの最大値を求める
  2. 最大値を元のテーブルと結合する
  3. timeの最大値、idの最大値、timeで降順にソートする

sql

1SELECT 2 t1.id 3 ,t1.tel 4 ,t1.time 5FROM 6 tablename AS t1 7 INNER JOIN 8 ( 9 SELECT 10 tel 11 ,MAX(time) AS maxtime 12 ,MAX(id) AS maxid 13 FROM 14 tablename 15 GROUP BY 16 tel 17 ) AS t2 18 ON t1.tel = t2.tel 19ORDER BY 20 t2.maxtime DESC 21 ,t2.maxid DESC 22 ,t1.time DESC 23;

投稿2017/07/27 11:27

編集2017/07/27 11:39
SVC34

総合スコア1149

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

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

SVC34

2017/07/27 14:30

idとtimeが常に昇順でinsertされるのであれば、ORDER BYにtimeを含めなくてもよいかも
konpei_konpei

2017/07/27 17:31

ご回答ありがとうございます。 今回の質問によりt1等が出てきたことによりエイリアス(別名)といったものの存在を初めて知りました! 調べて見ましたがいまいちピンとこなく今回の質問の回答の文が理解することができませんでした。 なので次はそちらについて質問をさせていただこうと思います!
guest

0

まずはidはユニーク属性だという前提でよろしいですね?

同じtimeの場合はidの逆順ということでしょうか?
またtelとtimeが両方一致する場合はこれもidの逆順でしょうか?
それともtelとtimeが両方一致するケースはないと保証されていますか?

sample

とりあえずsample上げておきます。

  • 元データ
create table tbl(id int not null unique,tel varchar(20),time date,unique(tel,time)); insert into tbl(id,tel,time) values (1,'08000001111','2017-07-01'), (2,'08011112222','2017-07-02'), (3,'08022223333','2017-07-03'), (4,'08033334444','2017-07-04'), (5,'08000001111','2017-07-05'), (6,'08055556666','2017-07-06'), (7,'08000001111','2017-06-30');
  • 抽出

SQL

1select t4.id,t4.tel,t4.time from ( 2select *,(select @a:=@a+1 from (select @a:=0) as dummy) as rank from tbl as t1 3where exists (select tel from tbl t2 group by tel 4having t1.tel=t2.tel and t1.time=max(t2.time) ) 5order by time desc 6) as t3 7left join tbl as t4 on t3.tel=t4.tel 8order by rank,t4.time desc 9

投稿2017/07/27 09:59

編集2017/07/27 10:20
yambejp

総合スコア114572

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

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

konpei_konpei

2017/07/27 10:10

ご質問ありがとうございます。 idはユニーク属性です。 timeが同じ場合はidは上記のですと逆順になっております。 結果としては逆順にしておきたいです。 telとtimeに関しては両方一致するケースはあります。
yambejp

2017/07/27 10:21

ちょっと条件にあうかわからないのですがsample付けときます もう少し工夫できそうな気がします
konpei_konpei

2017/07/27 17:31

ご回答ありがとうございます。 今回の質問によりt1等が出てきたことによりエイリアス(別名)といったものの存在を初めて知りました! 調べて見ましたがいまいちピンとこなく今回の質問の回答の文が理解することができませんでした。 なので次はそちらについて質問をさせていただこうと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問