【问题标题】:MYSQL match id with column keywords and show resultsMYSQL 将 id 与列关键字匹配并显示结果
【发布时间】:2013-05-21 16:26:23
【问题描述】:

我有一个数据库,其中包含数百个蛋糕和每个蛋糕的不同关键字。在这个例子中,我想要实现的是首先匹配至少有 2 个相似关键字的蛋糕——在这个例子中,它是蛋糕 1 和 4。(不知道如何在这里做一个表格,但我列出了 ids 1- 4,然后是一个名为成分的列,显示每个 ID 的三种成分。)然后我想显示它们。听起来很容易,但到目前为止我一直没有成功。任何帮助表示赞赏。

表名:甜点

id成分
1——软糖、焦糖、椰子—— 2.香草、榛子、椰子—— 3.香草、巧克力、软糖—— 4. 软糖、焦糖、香草--

基本上,我想展示所有具有两种或多种相同成分的蛋糕。不知道怎么查询。

【问题讨论】:

  • 你试过什么?你是什​​么数据库架构?如果您在“蛋糕”数据库的某个字段中列出成分,那您就大错特错了……
  • 如果您没有在表中放置逗号分隔值,您将更轻松地为这个问题编写查询。理想的架构应该有一个名为“ingredients”的单独表,其中包含“dessert_id”列。
  • 所有值都用逗号分隔,例如,软糖、焦糖、椰子。我怎样才能使用我所拥有的?

标签: mysql database match resultset


【解决方案1】:

这是一个非常糟糕的数据库设计,正确的答案是改变它。理想情况下,您应该为蛋糕和配料设置单独的表,然后使用第三个表将蛋糕 ID 与配料 ID 关联起来。

但是假设蛋糕总是包含三种成分,你可以这样做,尽管你绝对不应该这样做:

SELECT DISTINCT id
FROM (SELECT id, SUBSTRING_INDEX(ingredients,',',1) AS ingredient FROM cakes
     UNION
     SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(ingredients,',',-2),',',1) AS ingredient FROM cakes
     UNION
     SELECT id, SUBSTRING_INDEX(ingredients,',',-1) AS ingredient FROM cakes) AS i
GROUP BY ingredient
HAVING count(*) >= 2

它使用子选择创建三个成分表,每个用逗号分隔位置一个,它们组合为UNION。一旦您获得了这些信息,只需按成分对蛋糕进行分组并过滤掉那些未多次使用的成分(HAVING 子句)。这将为您提供包含非唯一成分的蛋糕 ID 列表。

这是一个可怕的解决方案,如果您的蛋糕包含四种或更多成分,则该解决方案将不起作用,但如果无法更改数据库设计,您可以添加更多 UNION 语句来说明更多可能的成分。

【讨论】:

  • 谢谢!我会尝试这个和正确的方法(三个表)。我只是不确定如何制作将蛋糕 ID 与成分 ID 关联起来的第三张表
  • 您的意思是写“AS成分FROM cakes) A​​S i”吗?快结束了吗?
  • 我做到了。 AS ingredient FROM cakes 只是SELECT 语句的结论,) 是关闭子选择(匹配FROM 之后的(),最后AS i 是因为当你在一个子选择您需要为其分配别名。通常,您会将子选择与另一个表连接起来,因此需要引用它的方法,但即使这里不需要它,如果没有它,MySQL 也会出错。
【解决方案2】:

@Michael - 三张桌子、蛋糕、配料和 cakes_ingredients_rel 非常正确。

  • 蛋糕有很多成分
  • 一种成分可用于许多蛋糕

这是多对多的关系。

因此使用关系表将蛋糕映射到配料:

CAKES_INGREDIENTS_REL
id
cakes_id
ingredients_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2017-01-28
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多