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

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

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

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

Q&A

解決済

6回答

6468閲覧

[MySQL] 降順でLIMIT句をつけて取得したデータを逆の順で文字列結合したい

Siketyan

総合スコア20

MySQL

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

0グッド

0クリップ

投稿2017/03/29 01:32

MySQLのGROUP_CONCAT関数を使用して文字列を結合したいと考えています。
下の図のような取得をしたいのですが、試した限りではうまくいきませんでした...
何か良い方法はないでしょうか?
なお、結果のid列(取得したい列とは別)にはAUTO_INCREMENTを設定しています。
GROUP_CONCAT関数以外でも構いませんので、よろしくお願いします。
イメージ

動作環境

Raspberry Pi 2 Model B
Raspbian 8.0
MySQL Server 5.5.54

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

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

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

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

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

guest

回答6

0

GROUP_CONCAT内でORDER BYを使用できるので、これで希望の結果が得られるのではないでしょうか。

GROUP_CONCAT(expr)

sql

1SELECT student_name, 2 GROUP_CONCAT(DISTINCT test_score 3 ORDER BY test_score DESC SEPARATOR ' ') 4 FROM student 5 GROUP BY student_name;

投稿2017/03/29 01:44

SVC34

総合スコア1149

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

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

0

こういうことなのでしょうか?

SQL

1create table tbl(id int primary key auto_increment,data varchar(20)); 2insert into tbl(data) values('a'),('b'),('c'),('d'),('e'),('f'),('g'); 3select group_concat(data order by id desc) as datas from tbl where id>=3 and id<=5;

投稿2017/03/29 01:56

yambejp

総合スコア114814

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

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

0

ベストアンサー

SQL

1CREATE TABLE `test` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `value` varchar(2) NOT NULL, 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 6 7INSERT INTO `test` VALUES (1, '1'); 8INSERT INTO `test` VALUES (2, '2'); 9INSERT INTO `test` VALUES (3, '3'); 10INSERT INTO `test` VALUES (4, '4'); 11INSERT INTO `test` VALUES (5, '5');

とした状態で、

SQL

1SELECT value FROM test ORDER BY value DESC 3;
value
5
4
3

ですから、まずこれを昇順に戻して

SQL

1SELECT * FROM (SELECT value FROM test ORDER BY value DESC LIMIT 3) vt1 ORDER BY vt1.value ASC;
value
3
4
5

としてから group_concat して、

SQL

1SELECT group_concat(vt2.value) FROM 2 (SELECT value FROM 3 (SELECT * FROM test ORDER BY value DESC LIMIT 3) vt1 4 ORDER BY vt1.value ASC) vt2;
group_concat(vt2.value)
3,4,5

ですかねえ。

投稿2017/03/29 01:48

tacsheaven

総合スコア13703

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

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

Siketyan

2017/03/29 01:56

とてもわかり易く説明していただきありがとうございます。 無事にこの方法で解決できました。 他に回答していただいた皆様も、ありがとうございました!
tacsheaven

2017/03/29 01:56

SVC34さんの書かれた通り、group_concat で order by を行えるので、 SELECT group_concat(vt1.value ORDER BY vt1.value ASC) FROM (SELECT value FROM test ORDER BY value DESC LIMIT 3) vt1; で望み通りの結果が得られますね。
guest

0

発想を変えて解決できます。
REVERSE関数で文字を反転させることができますので、

  1. 各行のカラム値をREVERSEする
  2. 結合後の文字列をREVERSEする

で望み通りの結果となるはずです。

投稿2017/03/29 01:43

yuba

総合スコア5568

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

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

0

Viewを使うことになりますが、このような方法はいかがでしょうか。

  1. 該当のテーブルの末尾から3件を取るビューを作成します。

SQL

1CREATE VIEW Last3 AS 2 SELECT * FROM hoge ORDER BY id DESC LIMIT 0, 3;
  1. 該当のテーブルのidをWHERE INを使って末尾3件に絞り込み、それをGROUP_CONCATで結合する。

SQL

1SELECT 2 GROUP_CONCAT(id) 3FROM 4 hoge 5WHERE 6 id IN (SELECT id FROM Last3) 7ORDER BY 8 id ASC;

投稿2017/03/29 01:59

masaya_ohashi

総合スコア9206

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

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

masaya_ohashi

2017/03/29 02:00

自分の手元だとサブクエリにLIMIT使えないバージョンだったので回りくどいことしてるうちに終わっていた…
Siketyan

2017/03/29 02:02

なるほど、Viewというものもあるんですね... 回答ありがとうございました!
guest

0

サブクエリで得た結果に対してGROUP_CONCATを使ってはどうでしょうか。

SQL

1SELECT GROUP_CONCAT(id separator ',') FROM ( 2 SELECT id FROM table ORDER BY id DESC LIMIT 3 3) AS A

投稿2017/03/29 01:48

ttyp03

総合スコア16998

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

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

ttyp03

2017/03/29 01:56

昇順に戻すのを忘れたので直そうかと思ってる間にベストアンサー決まってしまった。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問