获取连接表ID与文本字符串中的id不匹配的记录

时间:2015-08-24 03:06:41

标签: mysql

我有两个表,想要找出一个表中的行,而另一个表中没有相应的id和行。不幸的是,第一个表的id作为文本字符串包含在第二个表中: 带有列file_id的表“files”和带有列描述的表“product_desc”,其中file_ids包含在字符串中,如“file == 7”。无,每个字符串可以包含一个或多个file_id。

我正在寻找那些“product_desc”行,其中“files”中缺少file_id。在这个小例子中,它将是id为6的“product_desc”,因为表“files”中没有file_id = 5的文件:

表“文件”

file_id
1
2
10

表“product_desc”

id | description
3  | bla bla file==1 bla bla file==2 bla bla    
6  | bla bla blub file==5 bla bla file==10 bla bla 
7  | bla bla file==2 bla bla             

可能我需要子串函数,但我不知道如何。像

这样的东西
SELECT id FROM product_desc LEFT JOIN files ON id LIKE CONCAT '%file==',file_id,'%') WHERE file_id IS NULL

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为你的尝试非常好。这很接近:

SELECT pd.id
FROM product_desc pd LEFT JOIN
     files f
     ON pd.description LIKE CONCAT('%file==', f.file_id, '%')
WHERE f.file_id IS NULL;

问题是,如果一个匹配且缺少一个,那么您将无法获得产品描述记录。因此,这会找到缺少描述中所有文件ID的情况。

如果您认为任何给定描述中的文件ID都不同,那么您可以使用此hack来获得您想要的内容:

SELECT pd.id
FROM product_desc pd LEFT JOIN
     files f
     ON pd.description LIKE CONCAT('%file==', f.file_id, '%')
GROUP BY pd.id
HAVING COUNT(f.file_id) = (LENGTH(pd.description) -
                           LENGTH(REPLACE(pd.description, 'file==', 'file='))
                          );

HAVING子句计算file==在描述中出现的次数,方法是将每个匹配项替换为一个字符短一个字符串。这应匹配与ON子句匹配的数字,否则将丢失一个。