0

ここに私のデータがあります

ID  C1        C2               C3  
6             Digit 2          6,8,10,12
12            Digit 3          15
15  127       Digit 2          6,7,8,9,10,11,12,13
68  140,141   Digit 11         85,86,87,88,167,168,158,159
73  1         Digit 11         85,86,87,88,169,170
76            Digit 11         85,86,87,91,164,165,166,167,168
99            Digit 11         20,27,85,86,87
106           Digit 1          1,2
111           Digit 11         85,86,87,88
112           Digit 11         85,86,87,88
135           Digit 11         85,86,87

私の条件文字列は(2,6,15,37,42,52,62,65,79,85,94,100,104,107,113,124,131)です

ここで、値 127,140,​​141,1 がリスト条件にない場合、行 3,4,5 を除外します。Not in を試しましたが、役に立ちませんでした。基本的なものが欠けているのではないかと思いますが、それを取得できません。

4

2 に答える 2

0

可能であれば、列に複数の値を格納しないことをお勧めします。次に、このようなクエリを実行する方が簡単です。

"IN" または "NOT IN" は別のアイテムのリストを探しているため、使用できません。しかし、C3 はたまたまカンマが含まれている項目の 1 つにすぎません。

これを試して:

SELECT * FROM 
(SELECT ID, C1, C2, CONCAT('|',REPLACE(C3,',','|'),'|') as C3 FROM `table` WHERE `C3` ) as t1

WHERE t1.C3 NOT LIKE "|127|" AND t1.C3 NOT LIKE "|140|" AND t1.C3 NOT LIKE "|141|" AND t1.C3 NOT LIKE "|1|"

「|」を避けることができます 先頭と末尾に「,」を連結するだけです。

または、データベース スキーマを修正して、正規化されたリレーショナル データベースのように実際に動作するようにすることもできます。

複数の値を含むすべての列は、独自のテーブルに分離する必要があります。

上の表には列がありませんC3。代わりに、次の表が必要ですsome_other_data

この時点で、C3=6 がメイン テーブルの複数のレコードに関連付けられていることがわかります。したがって、実際には に加えて 3 つ目のリンク テーブルが必要ですsome_other_data。下記参照。

`some_other_data`
id
6
8
10
12
15

`main_table_to_some_other_data_link`
some_other_data_id | main_table_id
6                    6
8                    6
10                   6
12                   6
15                   12
6                    15

など。リンク テーブルにはいずれかの値の重複が含まれている可能性があることがわかります。ただし、他の 2 つのテーブルには完全に一意の ID があります。

于 2013-05-22T02:31:32.503 に答える
0

あなたは間違った問題を解決しようとしていると思います。

(テーブル構造を変更できると仮定しています。できない場合は、他の誰かがあなたの質問に対処する必要があります。)

カンマ区切りのデータの長いリストは、 と 1 対多の関係にあることを示すフラグですID

たとえば、C3独自のテーブルにデータを作成します。

ID   MainID   C3
================
 1      6      6
 2      6      8
 3      6     10
 4      6     12
 5     12     15
 6     15      6
 7     15      7
 8     15      8
 9     15      9
10     15     10
11     15     11
12     15     12
13     15     13
// and so forth //

したがって、ID は新しいテーブルの主キーであり、MainID主テーブルのレコードを参照する外部キーでありC3、C3 のデータです。

C3 の個々の値にはそれぞれ独自のレコードがあります。

今、あなたは次のようなものを使用する立場にあります

Select * from MainTable
    Inner Join NewTable
    On MainTable.ID = NewTable.MainID
    Where NewTable.C3 Not In (2,6,15,37,42,52,62,65,79,85,94,100,104,107,113,124,131);

可能であれば、1 対多のリレーションシップを独自のテーブルに引き出すと、作業が簡単になります。

于 2013-05-22T02:37:12.453 に答える