質問: get_nin_id('s6', num1, num2, num3, num4, num5) insert(...) ``` SQLにすると以下になります。 ``` select id from mst_nin_s6 where '5' in (num1, num2, num3, num4, num5, num6) AND '7' in (num1, num2, num3, num4, num5, num6) AND '11' in (num1, num2, num3, num4, num5, num6) AND '9' in (num1, num2, num3, num4, num5, num6) AND '4' in (num1, num2, num3, num4, num5, num6) ``` マスタテーブル構造は以下の通です。(mst_nin_s6) 中身は、数列Aのものです。 ![mst_nin_s6](https://teratail.storage.googleapis.com/uploads/contributed_images/fd7c195f2bbcbf0e82e27647c1ace3a2.png) チェック結果を入れるテーブル構造は以下の通りです。(input_nin_s6) 中のデータは、mst_nin_s6のid値(カンマ区切り)です。 ![input_nin_s6](https://teratail.storage.googleapis.com/uploads/contributed_images/8af1be41a7ed64eb9308745f6294f5c8.png) --- -------------- ここから、PHPでの処理 -------------- 存在するかを確認するクエリは以下の通です。 ``` select group_concat(distinct(mb.num1) SEPARATOR ',') as num1, group_concat(distinct(mb.num2) SEPARATOR ',') as num2, group_concat(distinct(mb.num3) SEPARATOR ',') as num3, group_concat(distinct(mb.num4) SEPARATOR ',') as num4, group_concat(distinct(mb.num5) SEPARATOR ',') as num5, group_concat(distinct(mb.num6) SEPARATOR ',') as num6 from input_nin_s6 as ib join mst_nin_s6 mb on ib.nin_s6_id REGEXP CONCAT('(^|,)', mb.id, '(,|$)') group by ib.id ``` このクエリを投げると、以下の結果になります。 ![クエリ結果](https://teratail.storage.googleapis.com/uploads/contributed_images/1d01cd32fee36365ad4b8cc5691b54be.png) 実際の数字が含まれているものだけを抽出したいのですが、関係ない物(10)が SQLの戻り値に入ってしまっています。 このため、Excelでの判断結果と違う物になっている状態です。 実際にほしいデータは 2,3,4,1 | 4,5 | 5,6,7 | 7,8,9 | | 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して、結果を取得する です。
回答: うーん・・・現在の情報だけでは的確な回答が難しいかもですね。 ですので回答というよりアドバイスです。 現在、最終結果は**集約(GROUP BY)して出して**ますが、 もしまだ行なっていないのでしたら、 一度集約を外して**結合(JOIN)した2テーブルからカラムを全表示**してみて、 データ状況を確認してみてはどうでしょう? 恐らくこの時点で想定外のデータの取れ方をしているはずです。 その確認を取ってから結合条件に誤りがないか確認しましょう。 さっくりまとめると調査手順は以下です。 1. 集約を解除し非集約の状態でデータ確認 2. 上で想定外なら結合条件が合っているかを見直し 3. 上が間違いないなら結合に利用するテーブルのデータ登録状況を確認 恐らくこの順番で調査すると何かヒントが掴めるかもしれません。 本題とはそれますが、 テーブル構造がテーブル設計上のアンチパターンを突き抜けてますね・・・。 カンマ区切りも基本的に扱いにくいのでid群は行レコードとして管理したいところですね。 (※著名な書籍でジェイウォークアンチパターンとして紹介されてます。) そうすれば結合時にREGEXP_CONCAT関数を適用するようなややこしい制御は不要となります。 かつデータベースは**特にテーブル同士の単純な結合に秀でている(パフォーマンスが良い)**ため、 よほど容量制約などがなければ、 テーブルの正規化やデータの行として保持する方法に徹する方が良いでしょう。