仅使用给定关键字搜索但没有更多

时间:2014-01-21 14:16:14

标签: mysql sql database search keyword

我需要构建一个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             |             -            |
+----------------------------------------------+--------------------------+

用语言来说,搜索必须根据我们提供的材料名称给出结果和产品名称作为输入。目的是帮助决定我们可以用我们拥有的材料和知识做些什么。

如果您有想法执行此类搜索,请提前感谢。我对包括数据库结构变化在内的任何想法持开放态我只需要一个查询来处理。除了查询我需要你的想法,我需要你的解释才能理解。

无论如何,谢谢你。

1 个答案:

答案 0 :(得分:0)

这是" 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表示没有材料。