2016-09-17 78 views
0

比方说,我有以下查询列出房子的人拥有的平均值:如何检查一个子查询的结果中是否存在一个ID?

SELECT PERSON.NAME, AVG 
FROM PERSON, (
    SELECT HOUSE.PID AS PID, AVG(HOUSE.VALUE) as AVG 
    FROM HOUSE 
    GROUP BY PID 
) HOUSES 
WHERE PERSON.PID = HOUSES.PID OR PERSON.ID NOT IN (
    SELECT PID 
    FROM HOUSE 
) 

查询做什么,我想要它做的,只是它不包括没有谁的人任何房屋的平均房屋成本应为“0”。

这是可能的,还是我的方式?

+1

您的查询基本上是一个INNER与另一个子查询加盟,你需要一个左加入 – Mihai

+0

Mihai的钉牢它。但是如果你还在挣扎,请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a -very-simple-sql-query – Strawberry

+0

[MySQL:连接类型的快速细分]的可能重复(http://stackoverflow.com/questions/6294778/mysql-quick-breakdown-of-the-types-of-加入) – Drew

回答

2

简单规则:从不FROM子句中使用逗号。 总是使用明确的JOIN语法。例如,在这种情况下,您想要一个LEFT JOIN,但无法表达它。

SELECT p.NAME, AVG_VALUE 
FROM PERSON p LEFT JOIN 
    (SELECT PID , AVG(VALUE) as AVG_VALUE 
     FROM HOUSE 
     GROUP BY PID 
    ) h 
    ON p.PID = h.PID; 

如果你想0代替NULL,外部查询使用COALESCE(AVG_VALUE, 0) as AVG_VALUE

+0

虽然有效,但两次使用相同的别名有点令人困惑。 – Strawberry

0

您应该使用left join,出现在个人表和不这样记录都有相应的房屋表中的记录将GRT在列空的房子

相关问题