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

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

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

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

SQL

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

Q&A

解決済

2回答

1223閲覧

MySQLにおいてSQL文をUnionしたい

sequence

総合スコア29

MySQL

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

SQL

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

0グッド

0クリップ

投稿2017/08/23 07:05

やりたいこと

同じテーブルで、異なるソート(order by)を2つ作成して、その2つの条件を連結させたいです。

具体的には以下の通りです。

テーブル(table_1)
idnumcreated
132017-08-10
242017-08-13
312017-08-15
452017-08-18
522017-08-20
##### 条件
  1. 現在(2017-08-23)から1週間以内のデータをcreated順に取得
    1. の後にnum順に取得

結果

idnumcreated
522017-08-20
452017-08-18
312017-08-15
132017-08-10
242017-08-13
  • idが5と4が条件1によるソート
  • idが1と2と3が条件2によるソート

現状

SQL文

select * from (select * from table_1 where created > "2017-08-16" ORDER BY created desc limit 5) UNION select id from (select * from table_1 order by num limit 5);
問題点
  • 2つのselect文の中でorder by を利用しようとするとlimitを利用しないといけない -> limitを数値が必要

聞きたいこと

このような実装以外に要件を満たせるような書き方はありますでしょうか。

よろしくお願いいたします。

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

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

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

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

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

yambejp

2017/08/23 07:16

同じデータを2回表示するのですか?
sequence

2017/08/23 07:18

同じデータは2回表示させません。unionだけだと、重複のデータは省いてくれるようです。
guest

回答2

0

where句で縛ればいいのでlimitをかける理由がわかりませんが、、、、

普通ソートは最後にやります。
例えば、疑似的な列(rank)を付けて、

select * from ( select *, 0 as rank from table_1 where created > "2017-08-16" UNION ALL select *, num as rank from table_1 where created <= "2017-08-16" ) order by rank, created desc

条件1は先に出てほしいので0を固定で設定。
条件2は単純にnum順で。
第二ソートキーにcreatedでソート、これは条件1のみに適用されるはず。
※rankは予約語かもしれませんので、別の名前にしたほうがいいかもしれません。

投稿2017/08/23 07:28

szk.

総合スコア1400

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

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

szk.

2017/08/23 07:29

おお~「 order by if」こんな書き方があったとは?!
sequence

2017/08/23 07:37

ありがとうございます。 whereを使って書けるんですね。
guest

0

ベストアンサー

UNIONするのが必須じゃないのであればこんな感じですか?

SQL

1select * from table_1 order by if(created > '2017-08-16',created,0) desc,num asc 2

投稿2017/08/23 07:25

yambejp

総合スコア114784

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

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

sequence

2017/08/23 07:32

ありがとうございます。 こんなに簡単にできるんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問