所以这是我的数据
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行。我试过不进,但没有用。我想我可能会遗漏一些基本的东西,但却无法得到它。
答案 0 :(得分: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。
答案 1 :(得分: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
是引用主表中记录的外键,而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);
如果可以的话,将一对多关系拉出到自己的表中会让事情变得更轻松。