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

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

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

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

Q&A

解決済

4回答

3231閲覧

指定したカラムの重複データを調べたい

marquez

総合スコア13

MySQL

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

0グッド

0クリップ

投稿2017/03/11 01:47

お世話になります。初歩的な質問かもしれませんが、データをセレクトする際のソートの仕方が分からず質問させてください。

no name address item_name ・・・・・
1 佐藤武 港区南北9丁目 サンマ
2 尾島修 品川区南3丁目 イワシ
3 小田淳 渋谷区北1丁目 クジラ
4 佐藤武 港区南北9丁目 サンマ
5 小田淳 渋谷区北1丁目 クジラ

上記のようなテーブルがあり、指定したカラムにおいて重複したデータがあった場合、

1 佐藤武 港区南北9丁目 サンマ
4 佐藤武 港区南北9丁目 サンマ
3 小田淳 渋谷区北1丁目 クジラ
5 小田淳 渋谷区北1丁目 クジラ
2 尾島修 品川区南3丁目 イワシ

このような順で呼出したいと思っています。

出来れば重複データのカウントも欲しいが、ひとまずこのような形で呼出す場合、どのようなSQLになるのでしょうか?

重複データはHAVINGを使うなどと調べていますが、指定した複数のカラムにまたがる場合のSQLが分かりません。

お忙しい中恐縮ですが、ご教示いただければば幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

重複データを並べるだけであれば、order byに複数並べると表示されますが

sql

1SELECT * FROM table_name ORDER BY name,address,item_name;

name,address,item_nameの3つ全てが重複したものだけの表示だと不足しますね

group by に複数カラムの指定が出来るので
name,address, item_nameが同じものの数を数えたければ

sql

1SELECT name,address,item_name,COUNT(*) 2FROM table_name 3GROUP BY name,address,item_name 4HAVING COUNT(*) >=2;

とできます

name,address,item_nameの3つ全てが重複したものだけを表示するなら、サブクエリを使って

sql

1SELECT main.*, sub.count 2FROM table_name AS main 3INNAR JOIN 4(SELECT name,address,item_name, COUNT(*) AS count FROM table_name 5 GROUP BY name,address,item_name HAVING COUNT(*) >=2) AS sub 6ON (main.name = sub.name AND main.address = sub.address AND main.item_name = sub.item_name) 7ORDER BY main.name,main.address,main.item_name

とできます

と書きましたがcountを使う必要がないなら、WHERE EXISTS使った方がよさそうです

投稿2017/03/11 03:02

tmasao

総合スコア105

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

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

marquez

2017/09/05 11:00

お返事が出来ておりませんでした。ご親切な回答にも拘らず、無視していたようで失礼いたしました。無事解決できております。ありがとうございました。
guest

0

重複データを調べるためにデータを並べ替えたい、と理解しました。(間違っていたらすいません)
であれば、Order Byを使うと良いです。

SQL

1select * From Table Order by name,Address 2 3```の様な形ですね。 4 5また、重複件数を調べるには下記の様にSQLを書きます。 6(nameが重複しているレコード件数を調べるSQLです。 7 item_nameも含めたいときはGroup by name,item_nameとしましょう。) 8```SQL 9SELECT name, COUNT(*) from test GROUP BY name having count(*) >=2

投稿2017/03/11 01:54

編集2017/03/11 01:55
motuo

総合スコア3027

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

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

marquez

2017/09/05 11:00

お返事が出来ておりませんでした。ご親切な回答にも拘らず、無視していたようで失礼いたしました。無事解決できております。ありがとうございました。
guest

0

ベストアンサー

こうしないとカウント数がかぶったときにきれいに並ばいないですね

  • 元データ

SQL

1create table tbl(id int primary key,d1 int,d2 int,d3 int); 2insert into tbl values(1,1,1,1),(2,2,2,2),(3,1,2,1),(4,1,1,1),(5,1,1,1),(6,2,2,2),(7,1,2,3),(8,1,2,1); 3
  • 抽出

SQL

1select * from tbl as t1 inner join 2(select d1,d2,d3,count(*) as cnt from tbl group by d1,d2,d3) as t2 3using(d1,d2,d3) order by cnt desc,d1 asc,d2 asc,d3 asc, id asc; 4

投稿2017/03/13 01:16

yambejp

総合スコア114843

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

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

marquez

2017/09/05 11:00

お返事が出来ておりませんでした。ご親切な回答にも拘らず、無視していたようで失礼いたしました。無事解決できております。ありがとうございました。
guest

0

同じものがあるものを最初に並べました。

sql

1select hogetb.* from hogetb left join ( 2select name,address,item_name,min(no) as nn from hogetb group by name,address,item_name having(count(*)>1) ) t1 3using (name,address,item_name) 4order by nn is null asc, nn, no;

no name address item_name
1 佐藤武 港区南北9丁目 サンマ
4 佐藤武 港区南北9丁目 サンマ
3 小田淳 渋谷区北1丁目 クジラ
5 小田淳 渋谷区北1丁目 クジラ
2 尾島修 品川区南3丁目 イワシ

投稿2017/03/11 03:38

編集2017/03/11 03:48
A.Ichi

総合スコア4070

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

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

marquez

2017/09/05 11:00

お返事が出来ておりませんでした。ご親切な回答にも拘らず、無視していたようで失礼いたしました。無事解決できております。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問