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 只是其中恰好有逗号的一项。

尝试这个:

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 与主表中的多条记录相关。因此,除了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

等等。您可以看到链接表可以包含任一值的重复项。但是您的其他两个表将具有完全唯一的 ID。

于 2013-05-22T02:31:32.503 回答
0

我认为您正在尝试解决错误的问题。

(我假设您可以更改表结构。如果您不能,其他人将需要解决您的问题。)

逗号分隔数据的长列表是一个标志,它们与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是引用你主表中记录的外键,是C3C3中的数据。

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);

如果可以的话,将一对多关系提取到它们自己的表中会让事情变得更容易。

于 2013-05-22T02:37:12.453 回答