![](/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.