簡體   English   中英

MySQL 在兩個表中搜索並從第一個表返回結果

[英]MySQL search in two tables and return results from the first table

我有兩張表ProductsItems

每個產品都包含按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%'

我想要實現的是如果有一個匹配的項目返回它的父Product ,那么也能夠在Items表上進行搜索。

因此,如果我搜索項目 1並通過product_id鏈接到產品 1 ,則返回產品 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

我怎樣才能做到這一點?

謝謝

您需要通過 JOIN 來聯合。

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

您可以在product_id上將兩個表相互LEFT JOIN連接,然后在兩個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%'

Output:

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

Output:

id  name
1   Product 1

dbfiddle 上的演示

我會使用:

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

使用此公式,如果多個項目與產品匹配,您不必擔心重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM