【问题标题】:Search With Only Given Keywords But Nothing More仅使用给定的关键字进行搜索,仅此而已
【发布时间】:2014-02-11 04:38:29
【问题描述】:

我需要建立一个 MySQL 数据库系统,用于搜索我们可以使用现有材料制作的产品。

到目前为止,我对数据库结构有了一个想法,但我无法编写查询来准确选择我想要的。

产品表

+-------+-------------+
|  id   |   product   |
+-------+-------------+
|   1   |   product1  |
+-------+-------------+
|   2   |   product2  |
+-------+-------------+
|   3   |   product3  |
+-------+-------------+
|   4   |   product4  |
+-------+-------------+

材料表

+-------+--------------+
|  id   |   material   |
+-------+--------------+
|   1   |   material1  |
+-------+--------------+
|   2   |   material2  |
+-------+--------------+
|   3   |   material3  |
+-------+--------------+
|   4   |   material4  |
+-------+--------------+
|   5   |   material5  |
+-------+--------------+
|   6   |   material6  |
+-------+--------------+

产品的材料需求表(多对多)

+-------+-------------+-------------+
|  id   |  productid  |  materialid |
+-------+-------------+-------------+
|   1   |      1      |      1      |
+-------+-------------+-------------+
|   2   |      1      |      2      |
+-------+-------------+-------------+
|   3   |      1      |      3      |
+-------+-------------+-------------+
|   4   |      1      |      4      |
+-------+-------------+-------------+
|   5   |      2      |      1      |
+-------+-------------+-------------+
|   6   |      2      |      2      |
+-------+-------------+-------------+
|   7   |      2      |      3      |
+-------+-------------+-------------+
|   8   |      3      |      3      |
+-------+-------------+-------------+
|   9   |      3      |      4      |
+-------+-------------+-------------+
|  10   |      3      |      5      |
+-------+-------------+-------------+
|  11   |      4      |      5      |
+-------+-------------+-------------+
|  12   |      4      |      6      |
+-------+-------------+-------------+

由于库存控制等进一步改进,需要单独使用材料表。这些只是数据库结构的示例。有了这些表格和数据,系统需要执行搜索。而真正的数据库会让我更加复杂和拥挤。

搜索示例;

+----------------------------------------------+--------------------------+
|                   search                     |          result          |
+----------------------------------------------+--------------------------+
|  material1, material2, material3, material4  |    product1, product2    |
+----------------------------------------------+--------------------------+
|        material1, material2, material3       |          product2        |
+----------------------------------------------+--------------------------+
|  material3, material4, material5, material6  |    product3, product4    |
+----------------------------------------------+--------------------------+
|             material5, material6             |          product4        |
+----------------------------------------------+--------------------------+
|  material2, material3, material4, material5  |          product3        |
+----------------------------------------------+--------------------------+
|        material1, material2, material3       |          product2        |
+----------------------------------------------+--------------------------+
|        material4, material5, material6       |          product4        |
+----------------------------------------------+--------------------------+
|             material1, material2             |             -            |
+----------------------------------------------+--------------------------+

换句话说,搜索必须根据我们作为输入提供的材料名称给出带有产品名称的结果。目的是帮助我们决定如何利用我们拥有的材料和知识。

如果您有执行此类搜索的想法,请提前致谢。我对包括数据库结构更改在内的任何想法持开放态度。我只需要一个查询来处理。不仅仅是查询,我需要你的想法来解决,我需要你的解释来理解。

无论如何,谢谢。

【问题讨论】:

  • 我认为您可能想要一个与产品 ID 关联的全文搜索列。

标签: mysql sql database search keyword


【解决方案1】:

这是“set-within-sets”查询的示例。最灵活的回答方法是使用带有having 子句的聚合:

select p.*
from TableOfMaterialNeeds tomn join
     Products p
     on tomn.productid = p.productid join
     TableOfMaterials tom
      on tomn.materialid = tom.materialid
group by p.productid
having sum(find_in_set(tomn.material, @LISTOFMATERIALS) = 0) = 0;

变量@LISTOFMATERIALS假设有一个材质列表(如'material1,material2,...',逗号后面没有空格)。

只有当材料不在集合中时,find_in_set()才会返回0sum() 统计材料数量,= 0 表示没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多