gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:24:21 26 4
gpt4 key购买 nike

我有三个表 ( 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com