mysqlのこの「hoge」テーブルを
id where who
1 osaka ccc
2 tokyo fff
3 osaka bbb
4 tokyo eee
5 osaka aaa
6 tokyo ddd
id doko who
1 tokyo ccc
2 osaka fff
3 tokyo bbb
4 osaka eee
5 tokyo aaa
6 osaka ddd
このように並べたいと思っています。
id where who
1 osaka ccc
3 osaka bbb
5 osaka aaa
2 tokyo fff
4 tokyo eee
6 tokyo ddd
id doko who
1 tokyo ccc
3 tokyo bbb
5 tokyo aaa
2 osaka fff
4 osaka eee
6 osaka ddd
現在は,dokoに最初に出てきた順番に並べるために
where
tokyo
osaka
を抽出して、再度検索しています。
これを1回のsqlで、できないでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
doko
別のidの最小値を、並び順の項目とすれば良さそうです。
SQL
1select hoge.* 2from hoge inner join ( 3 select doko, min(id) as sort_id 4 from hoge 5 group by doko 6 ) as sort 7 on hoge.doko=sort.doko 8order by sort_id, id
投稿2019/08/12 04:59
編集2019/08/12 05:39総合スコア25173
0
おす!
ちょっと、おめぇの希望とは違うかもしんねぇけんどもよぅ、
こんなやり方じゃダメか?
SQL
1SELECT T.* 2FROM 3( 4 SELECT 5 *, 6 CASE 7 WHEN doko = 'osaka' THEN 1 8 WHEN doko = 'tokyo' THEN 2 9 WHEN doko = 'aichi' THEN 3 10 ELSE 999 11 END AS sort_idx 12 FROM test.hoge 13) AS T 14ORDER BY T.sort_idx ASC;
プログラムで動的にSQL生成していいならUNIONすりゃいいだけなんだが、
SQLだけでやろうと思ったら、
とりあえずおらが思いつくのはこういうやり方だな。
他のやつ用にCREATE TABLEとINSERT置いとくぞ。
SQL
1CREATE TABLE `test`.`hoge` ( 2 `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `doko` varchar(128) DEFAULT NULL COMMENT '場所', 4 `who` varchar(128) DEFAULT NULL COMMENT '誰', 5 PRIMARY KEY (`id`) 6) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='テストテーブル'; 7 8INSERT INTO `test`.`hoge` 9( 10 `doko`, `who` 11) 12VALUES 13('tokyo', 'ccc'), 14('osaka', 'fff'), 15('tokyo', 'bbb'), 16('osaka', 'eee'), 17('tokyo', 'aaa'), 18('osaka', 'ddd'), 19('aichi', 'zzz');
投稿2019/08/12 05:12
編集2019/08/12 05:25退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/12 07:22
2019/08/12 07:56
退会済みユーザー
2019/08/12 07:59
0
最初に出てきたっていうのは id 順に並べたときのことでしょうか?
sql
1SELECT A.* FROM hoge A 2 ORDER BY 3 (SELECT MIN(b.id) FROM hoge B WHERE B.doko = A.doko),id
投稿2019/08/12 05:06
編集2019/08/12 05:57総合スコア2626
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/12 05:09
2019/08/12 05:19
2019/08/12 05:46 編集
2019/08/12 05:49
2019/08/12 05:55 編集
2019/08/12 05:59 編集
2019/08/12 08:26
2019/08/12 09:32 編集
2019/08/12 11:51
2019/08/12 12:09
2019/08/12 12:18
0
カラム名に予約語が入っているのはちょっといただけないですね。
sql
1select * from `hoge` ordere by `where` asc
投稿2019/08/12 03:51
編集2019/08/12 03:52退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/12 04:14
退会済みユーザー
2019/08/12 04:17 編集
退会済みユーザー
2019/08/12 04:52
退会済みユーザー
2019/08/12 04:54
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/12 05:16
退会済みユーザー
2019/08/12 05:19
2019/08/12 05:41
2019/08/12 08:12
退会済みユーザー
2019/08/12 08:18
2019/08/12 08:42
退会済みユーザー
2019/08/12 08:57 編集