我有以下数据库结构:
`Products`
-------------------------------------
ID | ProductNo
-------------------------------------
1 | 3340
2 | 3450
`ProductVariants`
-------------------------------------
ID | MasterID (ref to `Products`.`ID`) | ProductNo
-------------------------------------
1 | 1 | 3341
2 | 1 | 3342
3 | 2 | 3451
如何通过一个查询获取产品及其产品变体?
编辑:
期望的结果:
MasterID | IsMaster | ProductNo | VariantProductNo
1 | 1 | 3340 | null
1 | 0 | 3340 | 3341
1 | 0 | 3340 | 3342
2 | 1 | 3450 | null
2 | 0 | 3450 | 3451
答案 0 :(得分:3)
您需要加入Id = MasterId
上的两个表:
select *
from products p
left join ProductVariants v
on p.id = v.Masterid
LEFT JOIN
即使在products
表中没有相应的记录,也会返回所有ProductVariants
。
INNER JOIN
将返回两个表中显示的记录。
这是一个visual explanation of joins,有助于学习连接语法。
如果您有更多表要加入,那么您可以使用:
select *
from products p
left join ProductVariants v
on p.id = v.Masterid
left join MasterArtikel m
on v.MasterId = m.MasterId -- you place the columns that join the tables here
答案 1 :(得分:1)
这样做
SELECT *
FROM Products
INNER JOIN ProductVariants
ON Products.ID = ProductVariants.MasterID
通常使用单个查询来提高效率(您可以在Products表上查询,循环查看结果,并为每个人在ProductVariants表上执行查询,但这样会慢得多)。
如果您想要没有变体的产品
,您可以使用LEFT OUTER JOIN按照您的更新要求,这样的事情(没有经过测试可以解释任何错别字)
SELECT Products.MasterID, 1 AS IsMaster, Products.ProductNo, NULL AS VariantProductNo
FROM Products
UNION
SELECT Products.MasterID, 0 AS IsMaster, Products.ProductNo, ProductVariants.VariantProductNo
FROM Products
INNER JOIN ProductVariants
ON Products.ID = ProductVariants.MasterID
ORDER BY MasterID, IsMaster DESC, ProductNo