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

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

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

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

Q&A

解決済

2回答

916閲覧

MySQLで、値の重複してるカラムから特定のものだけ1つに絞りたい

Dammyyy

総合スコア7

MySQL

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

0グッド

0クリップ

投稿2021/04/27 02:35

編集2021/04/27 07:33

前提・実現したいこと

以下のようなSQL文で取得したデータがあります。

SELECT * FROM table WHERE (trait_id = 101413 and type = 2) order by class = 1000 desc, type = 1 desc, id asc

現状の取得データ

idflagtypetrait_idclassname
4078221014131000'1571**'
4086221014131000'1545**'
4094221014131000'1545**'
4083221014131'1545**'
4084221014131'1545**'
4080221014131014'1571**'
4081221014131014'1571**'

これにさらに手を加え、「classが1000のものだけ、取得するカラムを1つに」したい場合、どのような条件を追加すればよいのでしょうか。

欲しい結果

idflagtypetrait_idclassname
4078221014131000'1571**'
4083221014131'1545**'
4084221014131'1545**'
4080221014131014'1571**'
4081221014131014'1571**'

取得する1つのカラムについての条件は特にありません。idが小さくても大きくてもどちらでも問題ありません。

試したこと

LIMIT句の追加(エラー)
SELECT * FROM table WHERE (trait_id = 101413 and type = 2 and (class = 1000 ilmit 1)) order by class = 1000 desc, type = 1 desc, id asc

補足

皆さんのお知恵をお借りしたいです。何卒宜しくお願い致します。

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

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

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

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

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

yambejp

2021/04/27 05:39 編集

type=2で絞り込んでいるのに1が表示されているのがおかしいです (4083とか4084)
Dammyyy

2021/04/27 07:32

転記ミスです。指摘ありがとうござます。
guest

回答2

0

ベストアンサー

order by class = 1000 desc, type = 1 desc, id ascは取得したいデータに関係がないので、省略します。

一番安易なやり方としてはUNION ALLを使う方法があると思います。

SQL

1(SELECT * FROM `table` WHERE trait_id = 101413 AND type = 2 AND class = 1000 LIMIT 1) 2UNION ALL 3(SELECT * FROM `table` WHERE trait_id = 101413 AND type = 2 AND class <> 1000)

MySQL8以降であればRANK()関数を使う方法も考えられます。

SQL

1SELECT * 2FROM ( 3 SELECT *, RANK() OVER (PARTITION BY class ORDER BY id) rnk 4 FROM `table` 5 WHERE trait_id = 101413 AND type = 2 6) t 7WHERE class <> 1000 OR rnk = 1

投稿2021/04/28 03:10

neko_the_shadow

総合スコア2273

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

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

0

こんな感じで。

SQL

1SELECT * FROM table t1 2WHERE (trait_id = 101413 and type = 2) 3 and not exists(select 1 from table where class=1000 and class=t1.class and id < t1.id) 4order by class = 1000 desc, type = 1 desc, id asc

投稿2021/04/27 02:57

sazi

総合スコア25206

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

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

Dammyyy

2021/04/27 06:36

早速の回答ありがとうございます。 私の提示条件のミスなのかもしれませんが、回答いただいたコードではclass=1000のレコードが1つも取得できませんでした...。 id < t1.idの不等号も入れ替えたりしてみましたが関係なさそうで… 何か足りないと思われる条件などございますでしょうか。
sazi

2021/04/27 07:37 編集

こちらで確認した内容では、1000のデータが1件だけになって取得されます。 「欲しい結果」にする為には、type = 2の条件を外さないと駄目ですけどね。 提示条件のミスというより、質問に無い条件が含まれるSQLを実行しているか、データが異なるとしか思えません。
yambejp

2021/04/27 12:48 編集

このSQLですと id:4078、type:1、class:1000のようなtypeが2でないclass:1000の idが小さい場合は拾えないですね、not existsの中にも (trait_id = 101413 and type = 2) の条件が必要になりそうです まぁサンプル数が少ないので検証がしづらいんですけど・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問