Mysql:排除不满足条件列表的行

时间:2013-05-22 02:18:14

标签: mysql sql join

所以这是我的数据

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行。我试过不进,但没有用。我想我可能会遗漏一些基本的东西,但却无法得到它。

2 个答案:

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

如果可以的话,将一对多关系拉出到自己的表中会让事情变得更轻松。