我有三张桌子(SQLFiddle 已创建表 http://sqlfiddle.com/#!9/a3dab)
橙色文本是我需要通过比较 Products.name 与 Filters.filter 获得的内容。
我发现子字符串匹配可以这样完成:
on Products.name LIKE CONCAT('%',Filters.filter,'%');
我只需要使用第一个过滤器匹配。所以“Mushroom soup”将匹配“Soup”而不是“Mushroom”。
这项任务的最佳方法是什么?
如果可能的话,请提供一个经过测试的 SQLFiddle 链接。
我尝试过的:(请随意跳过下面的所有内容)
尝试双连接:
update Products
left join Filters on Products.name LIKE CONCAT('%',Filters.filter,'%')
join Categories on Filters.category_name = Categories.name
set Products.category_id = Categories.id, Products.filter = Filters.filter;
但这并不会导致first正在使用匹配,因为第一个连接返回all过滤匹配(每个产品多行),第二次连接之后类别来自最后一个匹配。
例如:蘑菇汤进入“蘑菇配料”过滤器\类别,而不是“汤\餐食”。
还尝试了 join + order by:
select Products.name, Filters.*
from Products
left join Filters on Products.name LIKE CONCAT('%',Filters.filter,'%')
group by Products.name;
这会根据我的需要返回每个产品的第一个匹配项,但我无法在同一查询中进行第二次左连接,也无法在“更新”功能而不是“选择”之后使用“分组依据”来工作。
当 sqlfiddle 崩溃时:
CREATE TABLE Products
(
`name` varchar(30),
`category_name` varchar (30),
`category_id` int
);
INSERT INTO Products (`name`)
VALUES ('Mushrooms'), ('Can of mushrooms'),
('Can of soup'), ('Mushroom soup'),
('Tomato soup'), ('Tomato');
CREATE TABLE Filters
(
`filter` varchar(30),
`category_name` varchar(30)
);
INSERT INTO Filters (`filter`, `category_name`)
VALUES ('Can of', 'Canned food'), ('Soup', 'Meals'),
('Mushroom', 'Ingredients'), ('Tomato', 'Ingredients');
CREATE TABLE Categories
(
`id` int,
`name` varchar(30)
);
INSERT INTO Categories (`id`, `name`)
VALUES (1, "Canned food"), (2, 'Ingredients'), (3, 'Meals');