我有两个表,想要找出一个表中的行,而另一个表中没有相应的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
非常感谢您的帮助。
答案 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
子句匹配的数字,否则将丢失一个。