【问题标题】:Assign product category by string match from other table通过其他表中的字符串匹配分配产品类别
【发布时间】: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”行 - “盘子里的蘑菇汤”现在将匹配“蘑菇”并进入“成分”类别。
我认为问题在于第一次和第二次连接之间的排序,但我无法弄清楚。

如果您知道完成此任务的更好方法 - 请随时提供。 我只需要按照关键字匹配对产品进行排序,其中最匹配的关键字将具有优先权。

SQLFiddle

【问题讨论】:

  • 哪个DBMS?????? SQL 是一种语言。如果我们将解决方案发布到错误的 dbms 是没有用的。下面是对 SQL Server 的引用。这对你有用吗?
  • @Eric 哎呀。为 DBMS 添加了标签。

标签: mysql sql


【解决方案1】:

我不知道您使用的是哪种 SQL。 但是您正在寻找的是过滤表的子选择的连接。

查看这些链接了解更多信息:

SQL Server: How to Join to first row

LEFT JOIN only first row

【讨论】:

  • 好像是这样。我明天试试,然后告诉你结果如何。
  • 无法让它与我的案例一起使用 :( 得到“你的 SQL 语法有错误;”并且不知道如何正确实现它。
  • "GROUP BY Products.name;"给了我想要的结果,但它只适用于我的“选择”之后,而不是“更新”之后,在两个“左连接”(MySQL 5.6)之间。我想我最好简化\完善我的问题并再次发布。
  • 创建了更一般的问题和示例,因为使用您的建议我无法得到任何工作:(stackoverflow.com/questions/47142215/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多