使用JOIN在一个select语句中从同一列(可能的不同行)中选择

时间:2011-03-24 16:37:33

标签: mysql select join nested

首先,我搜索并发现了类似的问题,但没有一个看起来像我需要的。

其次,我创建了一个返回我想要的select语句,但是我没有使用JOIN,如果可能的话,我想要使用JOIN,使用JOIN来理解它。

假设我有这些表格(简化,因为实际表格较大):

products: 
fields: idproduct, name, idbaseunit; 
primary key: idproduct
foreign key: idbaseunit references units.idunit
-----------------------------------------------

units: 
fields: idunit, name
primary key: idunit
-----------------------------------------------

prodVSunit:
fields: idprodvsunit, idproduct, idunit, timesbaseunit, cost
primary key: idprodvsunit
foreign key: idproduct references products.idproduct
foreing key: idunit references units.idunit
-----------------------------------------------

这样做的行为是,我可以为同一产品提供不同单位,这些单位是基数的倍数,但成本与倍数不相关。我的英语不是很好,我不知道这是否得到了很好的解释,所以,这是一个例子:

如果我将大米作为产品注册并以盎司作为基础单位,我可以将磅(= 16盎司)作为一个整体。如果我以盎司的价格卖出盎司,价格可能与卖出的英镑不同,假设一盎司为1.00美元,一磅为15.45美元。

在数据库中它看起来像这样:

insert into units(`idunit`, `name`) values(1,'ounce')
insert into units(`idunit`, `name`) values(2,'pound')

insert into products(`idproduct`, `name`, `idbaseunit`) values(1,'rice',1)
insert into products(`idproduct`, `name`, `idbaseunit`) values(2,'sugar',1)

insert into prodVSunit(`idprodvsunit`, `idproduct`, `idunit`, `timesbaseunit`, `cost`) values(1,1,1,1,1.00)
insert into prodVSunit(`idprodvsunit`, `idproduct`, `idunit`, `timesbaseunit`, `cost`) values(2,1,2,16,15.45)
insert into prodVSunit(`idprodvsunit`, `idproduct`, `idunit`, `timesbaseunit`, `cost`) values(3,2,1,1,0.85)

如果我运行这个陈述,我得到了我想要的东西:

select pro.name as product, un.name as unit, pvu.timesbaseunit as 'times base unit', 
aux.name as 'base unit', pvu.cost
from units un, prodVSunit pvu, products pro,
(select prod.idproduct, prod.idbaseunit, unt.name from products prod, units unt
where prod.idbaseunit = unt.idunit) as aux  
where aux.idproduct = pvu.idproduct and pvu.idproduct = pro.idproduct and pvu.idunit = un.idunit

查询返回:

-------------------------------------------------------------------
product______|unit______|times base unit_|base unit_____|cost_
-------------------------------------------------------------------
rice_________|ounce_____|1_______________|ounce_________|1_________
rice_________|pound_____|16______________|ounce_________|15.45_____
sugar________|ounce_____|1_______________|ounce_________|0.85______

请注意(在结果中)'unit'和'base unit'来自同一个表列但有时来自不同的行。

到目前为止一直很好,但我无法用JOIN来解决它,是否可能?我想要它与JOINs的主要原因是2个嵌套查询很简单,但是,如果我有7或8个这样的关系,那将是一团糟

请原谅我这篇长篇文章,并提前致谢。

1 个答案:

答案 0 :(得分:1)

您只需要两次加入单位表。

我使用ANSI连接重写了您的查询以使其更具可读性,然后将第二次连接替换为单位的qub-query:

select pro.name as product, un.name as unit, pvu.timesbaseunit as 'times base unit', 
  baseUnit.name as 'base unit', pvu.cost
from prodVSunit pvu
  inner join units un on pvu.idunit = un.idunit
  inner join products pro on pvu.idproduct = pro.idproduct
  inner join units baseUnit on pro.idbaseunit = baseUnit.idunit