MySQL+Python3.5環境下で開発しています。
現在、Excelでまとまっている数式をPythonで記述し、MySQLに流し込み、PHPで表示という方法で開発を行っています。
そこで質問なのですが、以下のような数列があるとします。
数列A(mst_nin_s6の中身(抜粋))
1 | 2 | 3 | 4 | 5 | 6
1 | 2 | 3 | 4 | 5 | 7
...
6 | 7 | 8 | 9 | 10 | 11
数値は最大11までで、全てのパターンが網羅されているものとします。
上記数列に対して、以下の数列が存在するかを確認したいです。
数列B(チェック元となるテーブルの中身)
5 | 7 | 11 | 9 | 4
excelでの計算式は以下の通りです。
EXCEL
1IF( 2 AND( 3 OR(5=1, 7=1, 11=1, 9=1, 4=1), 4 OR(5=2, 7=2, 11=2, 9=2, 4=2), 5 OR(5=3, 7=3, 11=3, 9=3, 4=3), 6 OR(5=4, 7=4, 11=4, 9=4, 4=4), 7 OR(5=5, 7=5, 11=5, 9=5, 4=5) 8 ) 9,0,1)
数列Bを1つずつに分解して、数列Aに含まれるかを確認している計算式です。
上記Excelの計算式を、PythonとPHPにて実装しようとしています。
まず、以下のPythonを実行し、含まれるかどうかの判定をしています。
Python
1def get_nin_id(suffix, num1, num2, num3, num4, num5): 2 query = "select id from mst_nin_%s where " % (suffix) 3 if (suffix == 's8'): 4 for v in range(1, 6): 5 if (v != 1): 6 query += " AND " 7 varname = "num" + str(v); 8 query += "'%s' in (num1, num2, num3, num4, num5, num6, num7, num8)" % (eval(varname)) 9 10 elif (suffix == 's7'): 11 for v in range(1, 6): 12 if (v != 1): 13 query += " AND " 14 varname = "num" + str(v) 15 query += "'%s' in (num1, num2, num3, num4, num5, num6, num7)" % (eval(varname)) 16 elif (suffix == 's6'): 17 for v in range(1, 6): 18 if (v != 1): 19 query += " AND " 20 varname = "num" + str(v) 21 query += "'%s' in (num1, num2, num3, num4, num5, num6)" % (eval(varname)) 22... 23 24 cur = con.cursor() 25 cur.execute(query) 26 rows = cur.fetchall() 27 if (rows is None): 28 return 0 29 else: 30 ids = '' 31 for row in rows: 32 if ids == '': 33 ids = str(row['id']) 34 else: 35 ids += ',' + str(row['id']) 36 37 return ids 38... 39 40 # nin s6 41 # num1からnum5は、チェック元テーブルの中から取得した物(数列B) 42 nin6id = get_nin_id('s6', num1, num2, num3, num4, num5) 43 insert(...)
SQLにすると以下になります。
SQL
1select id from mst_nin_s6 where 2 '5' in (num1, num2, num3, num4, num5, num6) AND 3 '7' in (num1, num2, num3, num4, num5, num6) AND 4 '11' in (num1, num2, num3, num4, num5, num6) AND 5 '9' in (num1, num2, num3, num4, num5, num6) AND 6 '4' in (num1, num2, num3, num4, num5, num6) 7
マスタテーブル構造は以下の通です。(mst_nin_s6)
中身は、数列Aのものです。
チェック結果を入れるテーブル構造は以下の通りです。(input_nin_s6)
中のデータは、mst_nin_s6のid値(カンマ区切り)です。
-------------- ここから、PHPでの処理 --------------
存在するかを確認するクエリは以下の通です。
SQL
1select 2group_concat(distinct(mb.num1) SEPARATOR ',') as num1, 3group_concat(distinct(mb.num2) SEPARATOR ',') as num2, 4group_concat(distinct(mb.num3) SEPARATOR ',') as num3, 5group_concat(distinct(mb.num4) SEPARATOR ',') as num4, 6group_concat(distinct(mb.num5) SEPARATOR ',') as num5, 7group_concat(distinct(mb.num6) SEPARATOR ',') as num6 8from input_nin_s6 as ib join mst_nin_s6 mb on ib.nin_s6_id REGEXP CONCAT('(^|,)', mb.id, '(,|$)') 9group by ib.id
このクエリを投げると、以下の結果になります。
実際の数字が含まれているものだけを抽出したいのですが、関係ない物(10)が
SQLの戻り値に入ってしまっています。
このため、Excelでの判断結果と違う物になっている状態です。
実際にほしいデータは
2,3,4,1 | 4,5 | 5,6,7 | 7,8,9 | <empty> | 11
です。
なぜこのようなことが起こるのでしょうか。
足りない部分があれば、言って下さい。問題の無い範囲で追記します。
よろしくおねがいします!
---- 2017/01/15 16:40編集 ----
チェック元となるテーブルは、諸事情により公開することができません。申し訳ありません。
中のデータ構造は、最初の方で定義している、数列Bとなります。
---- 2017/01/15 16:50追記 ----
全体の流れをざっくりまとめると
Pythonでチェック元となるテーブルから値を取得して、mst_nin_s6(数列B)とぶつけ、input_nin_s6に結果を入れる
その後、PHPで、input_nin_s6をベースとしてmst_nin_s6とjoinして、結果を取得する
です。
回答1件
あなたの回答
tips
プレビュー