2011-03-24 120 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