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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

1425閲覧

【MySQL】連続しているデータを1種類としてレコード数をカウントしたい

Yasha_Wedyue

総合スコア830

MySQL

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

SQL

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

1グッド

0クリップ

投稿2018/08/08 06:25

お世話になります。

今回は、言葉で説明しづらいのですが、
注文で同じ商品が連続で並ぶのですが、連続している同じ商品を1種類としてレコード数をカウントしたいです。
伝わりづらいと思いますので、テーブルでご説明いたします。

iditem_name
1orange
2orange
3apple
4orange

この場合、

item_namecount
orange2
apple1
orange1

のような結果を返したいです。

私の発想では、どのように書けばよいのか分からりませんでした。
そもそもSQL文だけで出来るかどうかも不明なのですが…

説明しづらいため、検索もはかどりませんでした。
**「このようなワードで検索すればいい」**のような回答も大変助かります。
よろしくお願いいたします。

milkteas👍を押しています

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

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

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

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

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

yambejp

2018/08/08 07:08

抜け番があった場合は、連続していないと判断してよいのでしょうか。10 orange,11 抜け,12 orange
Yasha_Wedyue

2018/08/08 07:10

そこまで想定しておりませんでした。その場合、出来れば連続していると判断したいです。また、IDに抜けが出ないように設計はするつもりです。
sazi

2018/08/08 14:04

8.0以降なら分析関数が使えます。
Yasha_Wedyue

2018/08/08 23:20

今使っているサーバは5.7なので使えませんが、後学のために調べてみます。ありがとうございます!
guest

回答3

0

ベストアンサー

かなり無理やり感はありますが…。
あとIDが連続している前提です。

SQL

1set @num:=0; 2select item_name, count(*) as count from ( 3 select case when item_name=item_name2 or item_name=item_name3 then @num else @num:=@num+1 end as uni, item_name from ( 4 select A.id, A.item_name, B.item_name as item_name2, C.item_name as item_name3 from tbl as A 5 left join tbl as B on B.id=A.id-1 6 left join tbl as C on C.id=A.id+1 7 order by A.id 8 ) as ABC 9) as Z 10group by uni;

投稿2018/08/08 07:06

編集2018/08/08 07:08
ttyp03

総合スコア16996

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

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

Yasha_Wedyue

2018/08/08 07:11

回答ありがとうございます。 読み解いて試してみたいと思います。
Yasha_Wedyue

2018/08/08 07:22

出来ました!ありがとうございます! ユーザー変数の使い方が少し理解できました。
Yasha_Wedyue

2018/08/09 02:44 編集

気付きましたが、CASE文でitem_name3(次のitem_name)を見るとorange, orange, apple, apple, orangeのような時にorange:4, orange:1となってしまいます。 or item_name=item_name3を消して上手く行きましたが、不具合ないかもう少し見てみます。
ttyp03

2018/08/09 04:17

すみません、確かにおかしくなります。 こちらでも検証してみましたが、次の行までは見る必要はなさそうですね。 そうなると次の行の取得までは不要なので、LEFT JOINがひとつ減ります、
退会済みユーザー

退会済みユーザー

2018/09/16 06:40

期待通りの結果を得られるかもしれませんが、それが確約されないSQLで、 仕事では使いものになりませんので、マイナス投票します。 http://download.nust.na/pub6/mysql/doc/refman/5.1/ja/user-variables.html >基本的なルールは、ステートメントの一部でユーザ変数値を割り当てないこと >および同一ステートメント内の他部分で同じ変数を使用しないことです。 >期待通りの結果を得られるかもしれませんが、これは確約されていません。
ttyp03

2018/09/18 07:17

sql_loverさん> あくまでもリンク先の説明・サンプルを見た感じですが、今回のクエリとは若干趣が異なるような気がします。 今回のクエリではselect case を用いているので @num か @num:=@num+1 のどちらが実行されますが、サンプルでは @a,(@a:=20) のようにあり、両方が実行されるものです。 同一ステートメントという括りでは合致しますが、異なるケースではないかと思いますがいかがでしょうか。
mysql_help

2018/11/17 07:08

退会済ユーザ様 減点するなら下記の2点がより適切です。 https://dev.mysql.com/doc/refman/5.6/ja/user-variables.html >SET ステートメント以外では、同じステートメント内で、 >ユーザー変数に値を割り当ててその値を読み取ることは決してしないでください。 という記載に反して、割り当てた値を、読み取っていることが1点目。 select文の結果が10行なら、同じユーザ変数への10回以上の読取と割当を行ってます。 select文でのユーザ変数への値の代入は5.7で非推奨になり、8.0以降で削除予定の機能であることが2点目。 http://www.mysql.gr.jp/mysqlml/mysql/msg/16488
guest

0

下記にあるように
「1レコード前と変わったらフラグを立て、その数ごとにグルーピングして集計する」
という考えでSQLを作成すればMySQLでも同じように出来る気がします。
ちょっと実際にTBLとSQL作成は出来ていないですが御参考までに
https://community.oracle.com/thread/2596029

投稿2018/08/08 06:34

編集2018/08/08 06:54
milkteas

総合スコア79

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

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

Yasha_Wedyue

2018/08/08 06:59

回答ありがとうございます。 確認してみます。
Yasha_Wedyue

2018/08/08 07:20

旅人算メソッド、勉強になりました! ありがとうございます!
guest

0

「mysql 同じ値 まとめる」とかで検索?

投稿2018/08/08 06:44

ryusan_012

総合スコア59

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

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

Yasha_Wedyue

2018/08/08 06:59

回答ありがとうございます。 望んでいた結果は出ませんでした…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問