![](/img/trans.png)
[英]MYSQL: Query two tables and join results from second table to an array
[英]MySQL search in two tables and return results from the first table
我有兩張表Products和Items 。
每個產品都包含按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
我會使用:
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.