通过其他表中的字符串匹配分配产品类别

时间:2017-11-01 18:27:05

标签: mysql sql

我有很多产品需要分配类别和表格,其中包含用于识别内容的关键字。 一个类别可能有多个关键字,在这种情况下,应使用顶部的第一个匹配。

我提出了这个测试用例,它可以根据需要运行:

CREATE TABLE Products
    (`name` varchar(30), `category_id` int, `filter` varchar (30))
;

INSERT INTO Products
    (`name`)
VALUES
    ('Plate'),
    ('Mushrooms'),
    ('Mushroom soup in a plate'),
    ('Mushroom on a plate'),
    ('Tomato soup'),
    ('Sausage'),
    ('Soupcan')
;

CREATE TABLE Filters
(`filter` varchar(30), `category_name` varchar(30))
;
INSERT INTO Filters
    (`filter`, `category_name`)
VALUES
('Soup', 'Meals'),
('Mushroom', 'Ingredients'),
('Plate', 'Containers')
;

CREATE TABLE Categories
(`id` int, `name` varchar(30))
;
INSERT INTO Categories
    (`id`, `name`)
VALUES
    (1, "Ingredients"),
    (2, 'Containers'),
    (3, 'Meals')
;

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;

select Products.*, Categories.name as category_name from Products
left join Categories on Products.category_id = Categories.id

按照我需要的方式,按照#34;过滤器"中的第一个匹配分配类别 但是如果我向Filter表中添加另一行具有相同category_id的行(例如尝试添加:(' Soupcan','容器')到过滤器),结果不会是第一场比赛(或最后一场比赛) "盘中的蘑菇汤"必须去"用餐",因为它匹配第一个过滤行" Soup"。
但是,如果我添加' Soupcan',容器'排到过滤器 - "盘子里的蘑菇汤"现在将匹配"蘑菇"并进入"成分"类别。
我认为问题在于在第一次和第二次加入之间进行排序,但我无法弄明白。

如果您知道更好的方法来完成这项任务 - 请随时提供。 我只需要通过关键字匹配对产品进行排序,其中匹配的最顶层关键字将具有优先级。

SQLFiddle

1 个答案:

答案 0 :(得分:1)

我不知道你正在使用什么样的SQL。 但是你要找的是Filter表的子选择的连接。

有关详细信息,请参阅以下链接:

SQL Server: How to Join to first row

LEFT JOIN only first row