2011-02-10 41 views
0

我正在將第五個表添加到現有的連接。原始查詢將始終返回單個行,因爲where子句指定了唯一的ID。下面是我們所使用的表:mySQL:幾個表上的多列連接第二部分

表1
carid,CATID,makeid,modelid,caryear

表2
makeid,makename

表3
modelid,MODELNAME

表4
catid,catname

表5 ID,caryear,makename,MODELNAME

下面是現有的查詢我使用:

SELECT a.*, e.citympg, e.hwympg 
FROM table1 a 
    JOIN table2 b on a.makeid=b.makeid 
    JOIN table3 c on a.modelid=c.modelid 
    JOIN table4 d on a.catid=d.catid 
    JOIN table5 e on b.makename = e.make 
       and c.modelname = e.model 
       and a.caryear = e.year 
    WHERE a.carid = $carid; 

有2個問題,我需要解決 -

  1. 當在表5中不匹配,它不返回任何結果。似乎我需要做某種左連接或拆分查詢並進行聯合。

  2. 當表5中有匹配項時,它返回多行。由於沒有使用返回單行的標準,因此我會選擇citympg和hwympg的平均值。

這兩個目標都可以通過單個查詢來實現嗎?怎麼樣?

回答

2

假設我明白你想要什麼正確...這個查詢將每連接標準組合限制從表5的結果,一排,返回平均城市/ hwy mpg。

SELECT a.*, e.citympg, e.hwympg 
FROM table1 a 
JOIN table2 b on a.makeid=b.makeid 
JOIN table3 c on a.modelid=c.modelid 
JOIN table4 d on a.catid=d.catid 
LEFT JOIN (SELECT year, make, model, 
        AVG(citympg) as citympg, 
        AVG(hwympg) as hwympg   
      FROM table5 
      GROUP BY year, make, model) e on b.makename = e.make 
             and c.modelname = e.model 
             and a.caryear = e.year 
WHERE a.carid = $carid; 

請注意,當table5中沒有記錄時,它將返回NULL mpg值。

+0

完美!這工作正是我需要它的工作。 –

0

通常的方法是使用相關子查詢是這樣的:

SELECT a.* 
    , (SELECT avg(e.citympg) 
    FROM table5 e 
    WHERE e.make = b.makename 
     AND e.model = c.modelname 
     AND e.year = a.caryear 
    ) as citympg 
    , (SELECT avg(e.hwympg) 
    FROM table5 e 
    WHERE e.make = b.makename 
     AND e.model = c.modelname 
     AND e.year = a.caryear 
    ) as hwympg 
FROM table1 a 
    JOIN table2 b on a.makeid=b.makeid 
    JOIN table3 c on a.modelid=c.modelid 
    JOIN table4 d on a.catid=d.catid 
WHERE a.carid = $carid