如果产品表中存在品牌 ID,则从品牌表中获取品牌 ID 名称

Posted

技术标签:

【中文标题】如果产品表中存在品牌 ID,则从品牌表中获取品牌 ID 名称【英文标题】:Fetch brands id name from brand table if that brand id is present in products table 【发布时间】:2021-08-22 11:30:10 【问题描述】:

我有两个表:公司和产品 公司

id name
36 BMW
37 MERCEDES
39 LG
40 MI
42 APPLE
44 ONE PLUS
45 GODREJ INTERIO
46 USHA
47 NILKAMAL

产品

id brand cat_id
1 44 11
5 39 11
6 40 11
7 44 11
10 0 0
11 0 27
12 0 21
13 42 11
14 0 0

如果品牌 ID 在类别 ID 等于 11 的产品表中可用,我需要从公司表中获取品牌名称和品牌 ID

输出应该如下所示

id name
39 LG
40 MI
42 APPLE
44 ONE PLUS
SELECT b.id, b.name, b.media_file
FROM wo_products p
LEFT JOIN wo_companies b
    ON p.brand = b.id
WHERE category = 11 AND user_id = 1
ORDER BY p.id DESC

enter image description here

我从上述查询中得到了很好的结果,但品牌 ID 重复了多次。

【问题讨论】:

【参考方案1】:

如果我理解正确,您需要一个 exists 查询,其措辞与您的问题非常相似:

select c.*
from companies c
where exists (select 1
              from products p
              where p.brand = c.id and p.cat_id = 11
             );

【讨论】:

请检查我的查询。【参考方案2】:

这就是解决方案

SELECT b.id, b.name, b.media_file
FROM wo_products p
LEFT JOIN wo_companies b
    ON p.brand = b.id
WHERE category = 11 AND user_id = 1
GROUP BY id ORDER BY `name` ASC;

【讨论】:

你的问题中查询的区别在哪里? 查询中有一个新的group by 我也得到了空值,所以请告诉我如何跳过它。【参考方案3】:

最终解决方案

SELECT DISTINCT b.id, b.name, b.media_file
FROM wo_products p
LEFT JOIN wo_companies b
    ON p.brand = b.id
WHERE p.category = 11 AND p.user_id = 1 AND p.brand != ''
GROUP BY id ORDER BY `name` ASC;

【讨论】:

【参考方案4】:

如果您不介意轻微的性能损失,您可以使用更容易推理的子查询:

SELECT b.id, b.name, b.media_file
FROM wo_companies b
WHERE b.id in (
    SELECT p.brand
    FROM wo_products p
    WHERE p.cat_id = 11 AND p.user_id = 1
)

【讨论】:

以上是关于如果产品表中存在品牌 ID,则从品牌表中获取品牌 ID 名称的主要内容,如果未能解决你的问题,请参考以下文章

查询不返回空品牌字段

使用 eloquent laravel 获取连接表数据

“方法品牌不存在。”

如果值存在于多个表中,则从表中获取结果

从关系表中获取与额外信息的关系

使用BeautifulSoup获取产品ID,品牌名称和图像时,在我的代码中出现问题