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

标签 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,'%');

我只需要使用第一个过滤器匹配项。所以“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 匹配,因为第一次连接返回所有 过滤匹配(每个产品多行),而在第二次连接类别之后来自上一场比赛。

例如:蘑菇汤进入“Mushroom-Ingredients”过滤器\类别,而不是“Soup\Meals”。

还尝试加入 + 订购方式:

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

最佳答案

您使用 sqlfiddle 以及使用 Select 查询解决问题的尝试使任务变得非常简单。

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

所以。我已经按如下方式编辑了您的选择查询:

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

希望对您有所帮助!

关于MySQL用双左连接更新行,限制第一个匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47142215/

相关文章:

mysql - SQL查询: Indicate if a row had a value of 0

mysql - 我可以重命名由内部连接生成的表吗?

mysql - SQL SELECT DISTINCT 和 GROUP BY 查询不起作用

postgresql - 在 PostgreSQL 9.2 中更新数据库行而不锁定表

php - MySQL - 更新和删除查询不起作用

mysql - PHP/MySQL - 使用重复条目更新行

php - 获取mysql表中的字段数

php - 无法连接到 000webhost 中的数据库

python - Pandas GroupBy 和日期范围内的平均值

关于group by和max的MySQL查询问题