実施日:2022/03/12~2022/04/02
【今回の内容】
MYSQLのテーブル作成~データの追加で作成したデータを検索する。
作成したデータは以下の通り
+--------+--------+
|id +result |
+--------|--------|
|5900 |123 |
|5901 |234 |
|5902 |345 |
|5903 |456 |
|5904 |567 |
|5905 |678 |
|5906 |781 |
+--------+--------+
データの検索方法
select * from テーブル名 where カラム名 = データ ;
データの部分検索
select * from テーブル名 where カラム名 like '%データの一部分%' ;
※データの一部分から検索したい場合はLIKEを使用します。
'%データの一部分%'⇒データの一部分が該当するものがあるものを抽出する。
'%データの一部分' ⇒データの一部分が末尾に含まれているものを抽出する。
'データの一部分%' ⇒データの一部分が先頭に含まれているものを抽出する。
NOTをLIKEの前につけた場合は上記を否定した抽出が可能となります。
今回実現したいこと
1.resultのデータ(1~8)のそれぞれ何回表示されているかをカウントしたい。
2.1.実行処理を数字ごとに都度、コマンドを書かないで実行したい。
3.1.でカウントしたものを上位3つ迄を表示したい。
1.resultのデータ(1~8)のそれぞれ何回表示されているかをカウントしたい。
select count(result) from データベース名 where result like '%1%' ;
結果:2
又は
正規表現を使用してカウントする場合
select count(result) from テーブル名 where result regexp '[1]';
※正規表現でカウントした方が条件が多様であるため、正規表現のほうが使い勝手がいいと思いました。
残りの2~8をAの箇所に入れ替えれば同様にカウント出来ます。
2.実行処理を数字ごとに都度、コマンドを書かないで実行したい。
MySQL上でも変数を使用して、代入が出来ることが可能のようです。
変数の部分を下記のように設定しました。
set @no := 1 ;
select count(result) from テーブル名 where result like '%@no%' ;
結果は0でした。
予想であれば、2が返ってくるはずですが0で返って来てしまいました。
select文が変数に対して、何を返してきているのか検証します。
検証
調べてみると、上記のselec文は最初にfrom句以下を判断しているようです。
となると、テーブルにあるカラムの【1】を見て、カウントしているはずが、
判定が【0】で返ってきます。
可能性①
likeは変数の部分一致検索が出来ない?
⇒concatを使用すると、部分一致の検索が可能
【like '% '@no%' ;】を【like concat('%',@no,'%') ;】とする。
どうやらlikeは変数と%や_を纏めて認識しないようなので
concatを使用して、変数と%や_がそれぞれの文字として独立しているため
合体させる必要があるようです。
変数の取り扱いについては解決したので、今度はこの変数を1~8の数字を
自動で代入して、それぞれの出現回数を調べられるようにします。
変数に自動で代入する
上記で作成したselect文に自動処理で数字を代入して数字ごとに出現回数を集計する方法
【CREATE PROCEDURE】を使用してあらかじめSQLの命令文を作成する。
この中にSELECT文とそれを繰り返し変数に代入する処理を記載します。
DELIMITER //
###CREATE PROCEDUREの中に実行する;がいくつも含まれています###
###途中で実行がされないようにDELIMITER //で;を//に変更します###
CREATE PROCEDURE procedure名(in x int, in y int)
BEGIN
###BEGINからENDまでSQL命令文を一纏めにしたものであるということを意味します###
WHILE x <= y do
###WHILEで条件式を作成します。END WHILE迄が対象です###
select * from テーブル名 where result like concat('%',x,'%') ;
set x = 0 + 1 ;
END while ;
END
//
DELIMITER ;
###命令文が作成出来たので、実行処理の//を;にして元に戻します###
call procedure名(0, 8);
###0~8迄の集計結果が処理され表示されます。
今回はここまでです。