

初めて質問させていただきます。

現在、Excelで書かれている数式を、Python+SQLで代用し、PHPで表示するという  
プロジェクトを行っています。(脱Excelを目指しています)

その途中で引っかかった問題なのですが  
6～8桁の数列の中に、5桁の数列が含まれるかどうか調べる方法が分かりません。  
(1～5桁はできています)

例として、以下のような数列が定義されているとします。

1 | 2 | 3 | 4 | 5 | 6

この数列の中に

5 | 7 | 11 | 9 | 4

が全て含まれている場合、Trueとする。  
という計算を行っています。  
Excelでの記述の場合は

[code]

    IF(
        AND(
            OR(5=1, 7=1, 11=1, 9=1, 4=1),
            OR(5=2, 7=2, 11=2, 9=2, 4=2),
            OR(5=3, 7=3, 11=3, 9=3, 4=3),
            OR(5=4, 7=4, 11=4, 9=4, 4=4),
            OR(5=5, 7=5, 11=5, 9=5, 4=5
        )
    ,0,1)
    
[/code]

です。これをPython+SQLで記述しようとして

[code]

        query = "select id from mst_nin_%s where " % (suffix)
        if (suffix == 's8'):
            for v in range(1, 6):
                if (v != 1):
                    query += " AND "
                varname = "num" + str(v);
                query += "'%s' in (num1, num2, num3, num4, num5, num6, num7, num8)" % (eval(varname))
    
        elif (suffix == 's7'):
            for v in range(1, 6):
                if (v != 1):
                    query += " AND "
                varname = "num" + str(v)
                query += "'%s' in (num1, num2, num3, num4, num5, num6, num7)" % (eval(varname))
        elif (suffix == 's6'):
            for v in range(1, 6):
                if (v != 1):
                    query += " AND "
                varname = "num" + str(v)
                query += "'%s' in (num1, num2, num3, num4, num5, num6)" % (eval(varname))
    ...
    
[/code]

というPythonコードを準備し、SQLを生成しました。以下の通りです。

[code]

    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)
    
[/code]

その後、PHPで存在するかどうかのSQLを実行しました  
SQLは以下の通りです。

[code]

    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
    
[/code]

実行すると以下の結果が帰ってきます。  
[![SQL実行結果](https://i.stack.imgur.com/3eY8q.png)](https://i.stack.imgur.com/3eY8q.png)

このとき、全く関係ない10が帰ってきています。

なぜ10が帰ってくるのか不明です。わかる方、教えていただけませんでしょうか。

よろしくおねがいします。


CC BY-SA 3.0
2017-01-14T15:09:09.217
31849
2017-01-18T09:21:48.357
20221
question
python mysql sql
6桁～8桁の数列の中に5桁の数列が入っているか調べたい

[code]

    select id from mst_nin_s6 where
    '5' in (num1, num2, num3, num4, num5, num6)
    
[/code]

のin句の使い方ですが  
カラム名 in (値1,値2...)  
が通常だと思うのですが

ご提示のように  
値 in (カラム名1,カラム名2...)  
のような使い方はちょっと把握しておりません。  
phpでなくpython上でのqueryの返却結果が正常か確認されてみてはいかがでしょうか。

また、最初のExcelの例ですがセルに5|5|5|5|5等と入っていた場合も真となってしまい  
そもそもの期待値が誤っているのではないかと思います。


CC BY-SA 3.0
2017-01-17T06:15:55.657
31904
2017-01-17T11:07:07.723
2017-01-17T11:07:07.723
19716
19716
31849
answer


エクセルの数式は数値の重複や欠落分もtrueに判定しているということになりますね。  
※ ) が足りないのは省略したのかな？

SQL製品やポリシーが指定されていないので質問内のinの構文については許容されると仮定しておきます・・・

このSQLだと最小で6つのカラムの内、5つのカラムに指定の5つの数字があればtrueになります。  
残りの1つのカラムが条件にもれているので、  
上記を満たしたデータであれば1カラムはどのような値でも取得されます。  
このため10という数値が入ったと思われます。

(元が正しいのかは別として)エクセルと同じ判定にするには  
where num1 in ('5','7','11','9','4')  
and num2 in ('5','7','11','9','4')  
and num3 in ('5','7','11','9','4')  
and num4 in ('5','7','11','9','4')  
and num5 in ('5','7','11','9','4')  
といったように指定して下さい。

重複数字を除外したいならカラム同士を比較する必要があります。  
num1 != num2 and num1 != num3 and num2 != num3 and ・・・

どちらにしても説明文の内容と書かれた判定文が食い違っているので  
コードを作成する前に、元の仕様を確認した方がいいでしょう


CC BY-SA 3.0
2017-01-18T09:21:48.357
31945
2017-01-18T09:21:48.357
19995
31849
answer