繁体   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