MySQL поиск в двух таблицах и возврат результатов из первой таблицы - PullRequest
0 голосов
/ 27 мая 2020

У меня есть две таблицы Товары и Элементы .

каждая продукт содержит элементы отношения по product_id

Товары таблица:

| id    | name          |
|----   |-----------    |
| 1     | Product 1     |
| 2     | Product 2     |

Элементы таблица:

| id    | product_id    | name      |
|----   |------------   |--------   |
| 1     | 1             | Item 1    |
| 2     | 2             | Item 2    |

Итак, у меня есть возможность поиска по таблице Products :

SELECT * FROM products WHERE name LIKE '%product 1%'

То, что я пытаюсь достичь, - это возможность поиска также в таблице Items , если есть соответствующий элемент, возвращает его родительский Product .

Итак, если я ищу Item 1 , и он связан с Product 1 через product_id, тогда верну Product 1

Я пробовал:

(SELECT * FROM products WHERE name LIKE '%product 1%') UNION (SELECT * FROM items WHERE name LIKE '%item 1%')

Когда поисковые ключевые слова совпадают с Product 1, он возвращает продукт, но если поисковые ключевые слова Item 1, он возвращает item, а не product, и я хочу во всех случаях возвращать только products.

Как я могу этого добиться?

Спасибо

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Вам нужно ОБЪЕДИНЕНИЕ с СОЕДИНЕНИЕМ.

SELECT *
FROM products
WHERE name LIKE '%search term%'

UNION

SELECT p.*
FROM products AS p
JOIN items AS i ON p.id = i.product_id
WHERE i.name LIKE '%search term%'
1 голос
/ 27 мая 2020

Я бы использовал:

select p.*
from products p
where p.name LIKE '%search term%' or
      exists (select 1
              from items i
              where i.product_id = p.id and
                    i.name LIKE '%search term%'
             );

При такой формулировке вам не нужно беспокоиться о дубликатах, если несколько элементов соответствуют продукту.

1 голос
/ 27 мая 2020

Вы можете LEFT JOIN сопоставить две таблицы на product_id, а затем выполнить поиск в обоих полях name, чтобы найти совпадение, возвращая название продукта, если вы это сделаете. Мы используем LEFT JOIN, чтобы можно было искать товары, в которых нет товаров. Например (поиск названия продукта):

SELECT p.id, p.name
FROM products p
LEFT JOIN items i ON i.product_id = p.id
WHERE p.name LIKE '%Product 1%'
   OR i.name LIKE '%Product 1%'

Вывод:

id  name
1   Product 1

Или поиск названия товара:

SELECT p.id, p.name
FROM products p
LEFT JOIN items i ON i.product_id = p.id
WHERE p.name LIKE '%Item 1%'
   OR i.name LIKE '%Item 1%'

Вывод:

id  name
1   Product 1

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...