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

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

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

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

MySQL

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

Q&A

解決済

1回答

809閲覧

[MySQL]特定のグループで重複しているデータのみを除外して取得したい

entaro12345

総合スコア75

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

MySQL

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

0グッド

1クリップ

投稿2021/10/04 07:11

編集2021/10/04 11:45

前提・実現したいこと

MySQLを使用しています。
特定のカラムが重複しているデータを除外して取得(select)したいのですが、
単純なdistinctやgroup byでは厳しいと判断してご質問させていただきます。

■データ一覧

列1列2列3列4列5
A11101
A12101
A13101
B11102
B12102
B13102
C11103
C13103
D11104
E11105
E12105
E13105
E14105
E15105

■取得したいデータ

列1列2列3列4列5
A11101
A12101
A13101
C11103
C13103
D11104
E14105
E15105

列2~4が同一のものを除外したいです。

列1は、商品区分を意味しています
列2は、商品名を意味しています
列3は、商品コードを意味しています
列4は、価格を意味しています
列5は、搬入コードを意味しています

X 1 1 1 XX
X 1 2 1 XX
X 1 3 1 XX
※X部分は可変なデータになります。

↑↑列1=CはC 1 2 1 XXがないため、除外としたくないです。

説明不足で申し訳ありませんが、お力を貸してください。

試したこと

unionやgroup byを試してみましたが、うまくいきませんでした。

バージョン

MySQL 5.7.15

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

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

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

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

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

YT0014

2021/10/04 07:38 編集

条件を明確にしてください。 列5が除外か否かのキーとのことですが、各値の意味が説明されていないので、対応のしようがありません。
entaro12345

2021/10/04 07:43

失礼いたしました。 列1は、商品区分を意味しています 列2は、商品名を意味しています 列3は、商品コードを意味しています 列4は、価格を意味しています 列5は、搬入コードを意味しています 商品名、商品コード、価格が同一のものを除外したいのですが、 搬入コードごとにグループ化をしたいです。 搬入コードが別であれば別のデータとして扱って、取得(select)したいです。
YT0014

2021/10/04 07:48

この欄は、「質問への追記・修正の依頼」欄ですので、必要な情報は、質問を修正して、追記をお願いします。 なお、頂いた回答に従った場合、搬入コードが02の行が除外されている理由が一層不明になっております。
takanaweb5

2021/10/04 08:00

MySQLのバージョンを記載願います。
entaro12345

2021/10/04 08:21

YT0014さま 本文へ追記しました。 takanaweb5さま MySQLのバージョンを記載しました。
yambejp

2021/10/04 08:25

> Cは列3[商品コード]=2がないため除外対象ではなくしたい 「A 1 3 1 01」があるから除外対象なのでは? もう少し条件をはっきりした方がよいでしょう
entaro12345

2021/10/04 08:26

yambejpさま ありがとうございます。 もう少し整理して記載します。
sazi

2021/10/04 08:31

質問のデータ一覧には除外されるものはありませんよね? こういった質問の場合、質問の条件を含んだデータと、希望する結果のデータを、共に提示された方が良いですよ。
entaro12345

2021/10/04 08:38

saziさま かしこまりました。 整理が足りないと思いますので、少し考えてみます。
yambejp

2021/10/04 08:43 編集

AとBは列2-4が完全に合致するからBを削除するということでしょうか? AではなくBを削除するのは何をもって判断するのでしょうか? 列5はデータを除外するとき根拠にしてないのですか?
entaro12345

2021/10/04 08:43

yambejpさま >AとBは列2-4が完全に合致するからBを削除するということでしょうか? はい、どの通りでございます。 >AではなくBを削除するのは何をもって判断するのでしょうか? 列5の昇順で上のデータをselectしたいです。
yambejp

2021/10/04 08:56

列1と列5は必ず1対1で対応してるのでしょうか?
entaro12345

2021/10/04 08:57

yambejpさま いえ、下記のような例もございます。 例) 列1 列5 A 01 A 02
yambejp

2021/10/04 09:04

A 01 A 02 では列5を基準にBを削除することはできませんね
entaro12345

2021/10/04 09:12

yambejpさま 何度もありがとうございます。 列1を基準に削除することは可能でしょうか。
yambejp

2021/10/04 10:28

一応回答付けておきました 想定と違うようであれば具体的な例を上げてください
sazi

2021/10/04 13:30

セット商品のような感じですけど、それなら、EはA分を取り除くとおかしいような?
guest

回答1

0

ベストアンサー

SQL

1create table tbl (col1 varchar(10),col2 int,col3 int,col4 int,col5 int); 2insert into tbl values 3('A',1,1,1,1), 4('A',1,2,1,1), 5('A',1,3,1,1), 6('B',1,1,1,2), 7('B',1,2,1,2), 8('B',1,3,1,2), 9('C',1,1,1,3), 10('C',1,3,1,3), 11('D',1,1,1,4), 12('D',1,2,1,4), 13('D',1,3,1,4), 14('E',1,1,1,3), 15('F',1,1,1,3), 16('F',1,3,1,3);

AとBとDはおなじ、CとF、Eは独立
したがってB,D,Fを削除する

SQL

1delete from tbl where col1 in( 2select col1 3from ( 4select col1,group_concat(concat(col2,'_'),concat(col3,'_'),col4 order by col2,col3,col4 separator ':') as val 5from tbl 6group by col1 7) as t1 8 9having (select count(*)+1 from (select * 10from ( 11select col1,group_concat(concat(col2,'_'),concat(col3,'_'),col4 order by col2,col3,col4 separator ':') as val 12from tbl 13group by col1 14) as t2 15) as t3 16where col1<t1.col1 17and val=t1.val 18) >1 19)

削除じゃないタイプ

SQL

1select * from tbl where col1 in( 2select col1 3from ( 4select col1,group_concat(concat(col2,'_'),concat(col3,'_'),col4 order by col2,col3,col4 separator ':') as val 5from tbl 6group by col1 7) as t1 8 9having (select count(*)+1 from (select * 10from ( 11select col1,group_concat(concat(col2,'_'),concat(col3,'_'),col4 order by col2,col3,col4 separator ':') as val 12from tbl 13group by col1 14) as t2 15) as t3 16where col1<t1.col1 17and val=t1.val 18) =1 19)

投稿2021/10/04 10:28

編集2021/10/04 11:55
yambejp

総合スコア114812

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

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

entaro12345

2021/10/04 11:39

ご回答ありがとうございます。 試させていただきます。
entaro12345

2021/10/04 11:45

記述をミスしていて申し訳ありません。 データ削除ではなく、重複データを除外したデータをselectしたいです。
yambejp

2021/10/04 11:56

削除じゃないタイプ追記しました
entaro12345

2021/10/04 11:58

ありがとうございます! かくにんさせていただきます。
entaro12345

2021/10/04 13:00

実行させていただきました! 下記のデータが除外されずに取得できてしまいます。 E 1 1 1 3 E 1 2 1 3 E 1 3 1 3 恐れ入りますが、可能でしたらヒントでもよいのでお願いできますでしょうか。
yambejp

2021/10/04 13:15

命題があいかわらず合理的ではないので、どういう場合に何を取り出すか微妙 A 1 1 1 01 A 1 2 1 01 A 1 3 1 01 と E 1 1 1 05 E 1 2 1 05 E 1 3 1 05 E 1 4 1 05 E 1 5 1 05 を比較するなら、AとEは完全一致じゃないのでEは重複ではないです おそらく考え方が間違っていると思うのでもっと仕様をきちんと詰めてください
entaro12345

2021/10/04 23:22

ありがとうございます。 もう少し詰めてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問