【发布时间】:2018-04-14 03:44:06
【问题描述】:
我有很多产品需要我们分配类别和一个表格,其中包含关键字,您可以通过这些关键字来识别去哪里。 一个类别可能有多个关键字,在这种情况下,应该使用从顶部开始的第一个匹配项。
我想出了这个测试用例,它可以按我的需要工作:
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
根据我的需要,“过滤器”中的第一个匹配项会分配类别。
但是如果我向具有相同 category_id 的过滤器表添加另一行(例如尝试添加:(' Soupcan', 'Containers') 到 Filters),结果将不会是第一个匹配项(或最后一个匹配项)。
“盘子里的蘑菇汤”必须转到“膳食”,因为它匹配第一个过滤器行“汤”。
但是,如果我在过滤器中添加“Soupcan”、“Containers”行 - “盘子里的蘑菇汤”现在将匹配“蘑菇”并进入“成分”类别。
我认为问题在于第一次和第二次连接之间的排序,但我无法弄清楚。
如果您知道完成此任务的更好方法 - 请随时提供。 我只需要按照关键字匹配对产品进行排序,其中最匹配的关键字将具有优先权。
【问题讨论】:
-
哪个DBMS?????? SQL 是一种语言。如果我们将解决方案发布到错误的 dbms 是没有用的。下面是对 SQL Server 的引用。这对你有用吗?
-
@Eric 哎呀。为 DBMS 添加了标签。