MySQL Update rows with double left join, limiting first match

痞子三分冷 提交于 2020-01-03 19:24:27

问题


I have three tables (SQLFiddle with tables created)

Orange text is what I need to get by comparing Products.name with Filters.filter.

I figured out that substring match can be done like this:

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

I only need the first filter match to be used. So "Mushroom soup" will match "Soup" and not "Mushroom".

What is best approach for this task?

A tested SQLFiddle link, if possible, please.

What I tried: (feel free to skip everything below)

Tried double join:

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;

But this doesn't result in first match being used, because first join returned all filter matches (multiple lines per 1 product), and after second join categories are from last match.

For example: Mushroom soup got into "Mushroom-Ingredients" filter\category, instead of "Soup\Meals".

Also tried join + order by:

select Products.name, Filters.* 
from Products
left join Filters on Products.name LIKE CONCAT('%',Filters.filter,'%')
group by Products.name;

This returns the first match per product as I needed, but I can't do a second left-join in the same query, neither can I get "group by" to work after "update" function instead of "select".

For when sqlfiddle collapses:

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:


You made the task quite easy with your sqlfiddle as well as your attempt to solve the problem with Select query.

It works the way you want I guess and all I need to do is to add one more left join with category table (IDK why you were unable to join Category as it's working properly).

So. I've edited your select query as follows:

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;

You will get the results you want with this query.

Now, in order to update Products table with the result of this query, you can do following:

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

Hope it helps!



来源:https://stackoverflow.com/questions/47142215/mysql-update-rows-with-double-left-join-limiting-first-match

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!