Как выполнить полнотекстовый поиск в MySQL, объединяя несколько таблиц - PullRequest
0 голосов
/ 03 января 2019

Я создаю сайт электронной коммерции, используя 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 каждой таблицы и возвращать name и priceиз products таблицы.Проблема в том, что я не знаю, как выполнить полнотекстовый поиск, объединяющий все эти таблицы.

Есть ли простой способ сделать это?

1 Ответ

0 голосов
/ 03 января 2019

Вам нужен запрос, который LEFT JOIN s в каждой таблице, чтобы выполнить поиск с условием, основанным на полнотекстовой функции поиска MATCH, с предложением WHERE, чтобы отфильтровать несоответствующие записи.SELECT DISTINCT гарантирует, что вы не увидите дубликатов.

Нам необходимо вручную настроить критерии JOIN для каждой таблицы на products: option_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
...