mysql在两个表中搜索,并从第一个表返回结果

eqqqjvef  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(345)

我有两张table产品和物品。
每个产品都包含按关系排序的项 product_id 产品表:

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

项目表:

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

所以我有搜索表产品的能力:

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

我试图实现的是,如果有一个项目匹配返回它的父产品,也可以在items表上搜索。
所以如果我搜索项目1并且它通过 product_id 然后返回产品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 .
我怎样才能做到这一点?
谢谢

oewdyzsn

oewdyzsn1#

你需要一个联合体。

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%'
r6hnlfcb

r6hnlfcb2#

你可以 LEFT JOIN 这两张table靠在一起 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上演示

twh00eeo

twh00eeo3#

我会用:

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%'
             );

有了这个公式,你不必担心如果多个项目匹配一个产品重复。

相关问题