MySQL使用双左连接更新行,限制第一次匹配

时间:2017-11-06 17:08:52

标签: mysql group-by sql-update left-join mariadb

我有三张桌子(SQLFiddle with tables created

enter image description here

通过将Products.name与Filters.filter进行比较,我需要获得橙色文本。

我发现子串匹配可以像这样完成:

on Products.name LIKE CONCAT('%',Filters.filter,'%');

我只需要使用第一个过滤器匹配。所以“蘑菇汤”将匹配“汤”而不是“蘑菇”。

这项任务的最佳方法是什么?

如果可能,请测试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;

但这不会导致使用第一次匹配,因为第一次加入返回所有过滤器匹配(每1个产品多行),并且在第二次加入类别之后从上一场比赛开始。

例如:蘑菇汤进入“蘑菇成分”过滤器\类别,而不是“汤\餐”。

还试过加入+订单:

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');

1 个答案:

答案 0 :(得分:2)

您使用sqlfiddle完成任务非常简单,并尝试使用Select查询解决问题。

它按照你想要的方式工作我猜我需要做的就是在类别表中添加一个左连接(IDK为什么你无法加入Category,因为它正常工作)。

因此。我按如下方式编辑了您的选择查询:

select Products.name, Filters.*,Categories.id from Products
left join Filters
on Products.name LIKE CONCAT('%',Filters.filter,'%')
left join Categories
on Categories.name = Filters.category_name
GROUP BY Products.name;

您将通过此查询获得所需的结果。

现在,为了使用此查询的结果更新Products表,您可以执行以下操作:

update Products
left join Filters
on Products.name LIKE CONCAT('%',Filters.filter,'%')
left join Categories
on Categories.name = Filters.category_name
set Products.category_name = Filters.category_name, 
    Products.category_id = Categories.id;

Click here for Working Demo

希望它有所帮助!