如何组合两个表?

时间:2013-01-10 11:46:08

标签: mysql

我有以下数据库结构:

`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

2 个答案:

答案 0 :(得分:3)

您需要加入Id = MasterId上的两个表:

select *
from products p
left join ProductVariants v
  on p.id = v.Masterid

请参阅SQL Fiddle with Demo

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