【问题标题】:How to perform full text search in MySQL joining multiple tables如何在 MySQL 中执行全文搜索连接多个表
【发布时间】:2019-01-03 11:08:24
【问题描述】:

我正在使用MySQL 创建电子商务网站。我已成功创建数据并将其插入数据库。

这是我的数据库架构

table: categories                    table: product_types
+----+--------------+            +----+-------------+------------+
| id | name         |            | id | category_id | name       |
+----+--------------+            +----+-------------+------------+
|  1 | Electronics  |            |  1 |           1 | Smartphone |
|  2 | Fashion      |            |  2 |           1 | Speakers   |
+----+--------------+            +----+-------------+------------+

    table: products
+----+-----------------+-------------+-------------------+-------+
| id | product_type_id | category_id | name              | price |
+----+-----------------+-------------+-------------------+-------+
|  1 |               1 |           1 | Samsung Galaxy A3 |   300 |
|  2 |               1 |           1 | Samsung Galaxy A7 |   400 |
+----+-----------------+-------------+-------------------+-------+

    table: options                         table: option_values
+----+-----------------+-------+       +----+-----------+------------+
| id | product_type_id | name  |       | id | option_id | name       |
+----+-----------------+-------+       +----+-----------+------------+
|  1 |               1 | RAM   |       |  1 |         1 | 512 MB     |
|  2 |               1 | Screen|       |  2 |         1 | 1 GB       |
|  3 |               1 | OS    |       |  3 |         3 | Android 5  |
+----+-----------------+-------+       |  4 |         3 | Android 6  |
                                       |  5 |         2 | HD         |
                                       |  6 |         2 | FHD        |
                                       +----+-----------+------------+
     table: product_option_values
+----+------------+-----------+-----------------+
| id | product_id | option_id | option_value_id |
+----+------------+-----------+-----------------+
| 15 |          1 |         1 |               1 |
| 16 |          1 |         2 |               5 |
| 17 |          1 |         3 |               3 |
| 18 |          2 |         1 |               2 |
| 19 |          2 |         2 |               6 |
| 20 |          2 |         3 |               4 |
+----+------------+-----------+-----------------+

搜索必须通过每个表的name 列触发,并从products 表返回nameprice。 问题是我不知道如何执行加入所有表格的全文搜索。

有什么简单的方法吗?

【问题讨论】:

  • 我认为你不需要这么多的连接,为了获得更好的响应时间,我认为最好避免一些规范化。例如,选项值表可以使用选项名称而不是 option_id,并且可以使用选项值名称代替 option_value_id。这样您就可以避免加入搜索。

标签: mysql search full-text-search e-commerce


【解决方案1】:

您需要在每个表上使用LEFT JOINs 的查询来使用基于全文搜索功能MATCH 的条件进行搜索,并使用WHERE 子句过滤掉不匹配的记录。 SELECT DISTINCT 确保您不会看到重复项。

我们需要手动将每个表中的JOIN 条件调整为productsoption_values 是最复杂的情​​况,因为它不直接引用products(需要在product_option_values 上进行附加连接,使用别名pov 下方。

SELECT DISTINCT p.name, p.price
FROM 
    products p
    LEFT JOIN categories c
        ON  MATCH(c.name) AGAINST('foo' IN NATURAL LANGUAGE MODE)
        AND c.id = p.category_id
    LEFT JOIN product_types pt
        ON  MATCH(pt.name) AGAINST('foo' IN NATURAL LANGUAGE MODE)
        AND pt.category_id = p.category_id
    LEFT JOIN options o
        ON  MATCH(o.name) AGAINST('foo' IN NATURAL LANGUAGE MODE)
        AND o.product_type_id = p.product_type_id  
    LEFT JOIN product_option_values pov 
        ON  pov.product_id = p.id 
    LEFT JOIN option_values ov
        ON  MATCH(ov.name) AGAINST('foo' IN NATURAL LANGUAGE MODE)
        AND ov.id = pov.option_value_id 
WHERE 
    COALESCE(c.id, pt.id, o.id, ov.id) IS NOT NULL

【讨论】:

  • 谢谢,那么 optionsoption_values 呢?我怎样才能也加入他们?
  • @SDeaV :这就是我写的,你需要适应其他关系......无论如何,我用完整的 SQL 代码更新了我的答案。
  • 谢谢@GMB。但是还有一件事对我来说实际上是最难的。我真的不明白。最后一张表product_option_valuesoption_valuesproucts 之间存在关系。例如,“512 MB”的 RAM 和“HD”屏幕仅适用于 id = 1 的 product。该查询将如何处理它?
  • 查询通过添加一个额外的连接来处理它,通过表options:所以关系就像option_values (ov) > options (o2) > products (p)。仔细阅读查询。
  • 它给出了这个错误。 SQL 错误 [1064] [42000]:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 14 行的“AND o2.product_type_id = p.product_type_id LEFT JOIN option_values ov”附近使用正确的语法
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多