2011-03-24 121 views
1

从同一列(可能不同的行)中选择首先,我搜索并发现了类似的问题,但没有一个看起来像我所需要的。在一条SELECT语句中使用JOIN

其次,我做了一个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 
----------------------------------------------- 

这样做的行为,我可以有相同的产品,是的BaseUnit但成本的倍数不同单位与倍数不是相对的。我的英文不太好,我不知道这是否很好解释,所以,下面是一个例子:

如果我将大米注册为产品并以盎司作为基本单位,我可以用英镑(= 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______ 

注意(在结果中)“单位”和“基本单位”来自同一个表列,但有时候来自不同的行。

到目前为止好,但我无法弄清楚使用联接,是否有可能?我想要JOINs的主要原因是有2个嵌套查询很好用,但是,如果我有这样的7或8关系,这将是一个混乱

请原谅我长张贴并提前致谢。

回答

1

你只需要连接到单位表两次。

我使用ANSI连接,使其更具可读性改写了您的查询,然后用第二替换QUB查询加盟单位:

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 
+0

哦!得到它了!!谢谢!!! – Soulless 2011-03-24 19:23:44