我正在为现有联接添加第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;
我需要解决两个问题 -
如果表5中没有匹配项,则不会返回任何结果。我似乎需要做一些左连接或拆分查询并进行联合。
当表5中存在匹配时,它返回多行。由于没有使用返回单行的标准,我会选择平均的citympg和hwympg。
可以通过单个查询实现这两个目标吗?怎么样?
答案 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