当前位置: 首页 > 知识库问答 >
问题:

按其他表中的字符串匹配项分配产品类别

周弘毅
2023-03-14
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'),结果将不是第一个匹配(或最后一个匹配)。
“mushroom soup in a plate”必须转到“d餐会”,因为它匹配第一个过滤器行“soup”。
但如果我向过滤器添加'soupcan','containers'行-“mushroom soup in a plate”现在将匹配“mushroom”并进入“firedents”类别。
我认为问题在于在第一个和第二个连接之间排序,但我想不出来。

如果你知道一个更好的方法来完成这个任务--请随时提供。我只需要排序产品的关键字匹配,其中最大的关键字匹配将有优先级。

SQLFiddle

共有1个答案

钱焕
2023-03-14

我不知道你用的是什么样的SQL。但您要查找的是筛选表的一个子选择的联接。

有关更多信息,请参阅以下链接:

SQL Server:如何连接到第一行

 类似资料:
  • 我有两张桌子: Product\u表 Productbreak\u表 我的目标是只获取不在productbreak_table的和日期之间的产品 结果应该是:

  • 问题 你想要匹配两个或多个字符串。 解决方案 计算把一个字符串转换成另一个字符串所需的编辑距离或操作数。 levenshtein = (str1, str2) -> l1 = str1.length l2 = str2.length prevDist = [0..l2] nextDist = [0..l2] for i in [1..l1] by 1

  • 问题内容: 具有下表(): 另一个帮助表(): 我正在寻找一个SQL查询来输出以下内容: 所以,每一次是和是 在 响应表, 汇总 对话上下文到这一点,忽略不池中的响应结束谈话的一部分。 在上面的示例中,活动 响应文本 为1中的 3 。 我尝试了以下复杂的SQL,但有时会中断将文本汇总错误的情况: 我敢肯定有更好的方法。 问题答案: 这是我的看法: 这将扫描表一次,但是我不确定它的性能是否会比您的解

  • 问题内容: 我需要一个匹配但不匹配的正则表达式 我希望它只匹配foo及其周围的所有内容,只要不跟在bar后面即可。 我尝试使用此方法:这是相当接近的,但它匹配。负面的眼光需要匹配任何东西,而不仅仅是障碍。 我使用的特定语言是Clojure,它在后台使用Java正则表达式。 编辑:更具体地说,我也需要它通过但不是。 问题答案: 尝试: 测试: 正则表达式说明 其他正则表达式 如果您只想排除紧接其后的

  • 本文向大家介绍Python中的DI字符串匹配,包括了Python中的DI字符串匹配的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个仅包含“ I”(表示增加)或“ D”(表示减少)的字符串S,令N = S的大小。我们必须返回[0,1,... ,N]使得对于范围0,...,N-1中的所有i- 如果S [i]为“ I”,则A [i] <A [i + 1] 否则,当S [i]为“ D”时,则A [

  • 我有一些xml文件,希望删除除特定字符串以外的所有内容。 StackOverflow上还有很多类似的问题,但都不适用于我的文件,在尝试了几个小时不同的正则表达式后,我想寻求帮助。 到目前为止,部分成功但并非完全成功的最接近的正则表达式是: xml文件的示例: 我使用regex101,因此可以将示例粘贴在那里,以了解为什么rex只能部分工作。简而言之,它与第一次出现的不匹配,但与第二次出现的匹配。我