mySQL:第二部分的多列表连接

时间:2011-02-10 00:12:40

标签: mysql join union

我正在为现有联接添加第5个表。原始查询将始终返回单行,因为where子句指定唯一ID。以下是我们使用的表格:

表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;

我需要解决两个问题 -

  1. 如果表5中没有匹配项,则不会返回任何结果。我似乎需要做一些左连接或拆分查询并进行联合。

  2. 当表5中存在匹配时,它返回多行。由于没有使用返回单行的标准,我会选择平均的citympg和hwympg。

  3. 可以通过单个查询实现这两个目标吗?怎么样?

2 个答案:

答案 0 :(得分:2)

假设我理解你想要的正确...这个查询会将table5的结果限制为每个连接条件组合的一行,返回平均城市/ 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值。

答案 1 :(得分: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