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

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

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

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

SQL

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

Q&A

解決済

3回答

486閲覧

MySQLで同テーブルのレコード比較2

takumil

総合スコア9

MySQL

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

SQL

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

0グッド

1クリップ

投稿2021/07/27 11:29

https://teratail.com/questions/351061#reply-481003

上記で類似の質問をさせていただき解決へと導いていただいたのですが
少し違った内容の結果をもとめられ、ここ数日格闘してますが思うようにいきません。

|id|level|item|customer|
|:--|:--:|--:|
|1|1|商品A1|1|
|2|1|商品B1|2|
|3|1|商品C1|2|
|4|2|商品A2|1|
|5|2|商品B2|2|
|6|2|商品C2|1|
|7|3|商品A3|2|
|8|3|商品B3|1|
|9|3|商品C3|2|

上記のようなテーブルがあったとして
itemそれぞれの
「商品A1と商品A2と商品A3」,「商品B1と商品B2と商品B3」,「商品C1と商品C2と商品C3」をグループとして
levelが小さいレコードをcustomerごとに抽出するような
SQLは可能なのでしょうか?

customer 1の場合

|id|level|item|customer|
|:--|:--:|--:|
|1|1|商品A1|1|
|8|3|商品B3|1|
|6|2|商品C2|1|

cutomer 2の場合

|id|level|item|customer|
|:--|:--:|--:|
|7|3|商品A3|2|
|2|1|商品B1|2|
|3|1|商品C1|2|

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

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

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

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

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

guest

回答3

0

まず、アイテムがどのグループに属するのかを決めるテーブルもしくはビューを作成します (ここでは例としてビューを用いました)。

sql

1CREATE VIEW GROUPING (item, grp) AS 2 SELECT '商品A1', 'A' 3 UNION ALL SELECT '商品A2', 'A' 4 UNION ALL SELECT '商品A3', 'A' 5 UNION ALL SELECT '商品B1', 'B' 6 UNION ALL SELECT '商品B2', 'B' 7 UNION ALL SELECT '商品B3', 'B' 8 UNION ALL SELECT '商品C1', 'C' 9 UNION ALL SELECT '商品C2', 'C' 10 UNION ALL SELECT '商品C3', 'C'

あとは以下のようなSQLで目的を達成できると思います。

sql

1 2SELECT T1.id, T1.level, T1.item, T1.customer 3FROM テーブル AS T1 4JOIN GROUPING AS G1 ON T1.item = G1.item 5WHERE NOT EXISTS ( 6 SELECT * 7 FROM テーブル AS T2 8 JOIN GROUPING AS G2 ON T2.item = G2.item 9 WHERE T1.customer = T2.customer 10 AND G1.grp = G2.grp 11 AND T1.level > T2.level 12) 13AND T1.customer = 2

投稿2021/07/28 10:25

neko_the_shadow

総合スコア2259

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

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

takumil

2021/08/12 06:59

回答いただきありがとうございました。
guest

0

sql

1SELECT * 2FROM テーブル 3WHERE (level, LEFT(item,3), customer) IN 4 (SELECT MIN(level), LEFT(item,3), customer 5 FROM テーブル 6 GROUP BY customer, LEFT(item,3) 7 ) 8ORDER BY customer, item

http://sqlfiddle.com/#!9/bf35c4/10

投稿2021/07/27 22:17

takanaweb5

総合スコア358

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

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

takumil

2021/08/12 06:59

回答いただきありがとうございました。
guest

0

ベストアンサー

MySQLではなくSQL-Serverで検証してみました。

T

1SELECT 2 テーブル.id 3 , テーブル.level 4 , テーブル.item 5 , テーブル.customer 6FROM テーブル 7INNER JOIN ( 8SELECT 9 MIN(level) AS MINlevel 10 , LEFT(item,3) AS ite 11 , customer 12FROM テーブル 13WHERE customer = 1 14GROUP BY 15 LEFT(item,3) 16 , customer 17) AS A ON テーブル.level = A.MINlevel 18 AND LEFt(テーブル.item,3) = A.ite 19 AND テーブル.customer = A.customer 20ORDER BY 21テーブル.item

提示頂いたテーブル内容だとうまくいくかも知れませんが
色々なデータが入ってきた場合意図した結果にならない可能性があります。
パズルとしては良いかも知れませんが
実運用にもっていくならテーブル設計を見直した方が良いと思いました。

投稿2021/07/27 14:27

odataiki

総合スコア938

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

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

takumil

2021/08/12 06:59

回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問