查询自动排除没有条目的记录

时间:2016-05-03 12:38:53

标签: mysql sql

这些是我的表:o,p和v对应于订单,人和村

v对应村庄

 vk | vname
 1  |  v1
 2  |  v2
 3  |  v3

p对应村里的人。 A和B住在V1。 C住在V2。

 pk | pname | vk
 1  | A     | 1
 2  | B     | 1
 3  | C     | 2

o对应于人们下达的订单。来自V1的人A已经下了3个订单,来自V2的人C已下了1个订单。

 ok | pk | cost
 1  | 1  | 10
 2  | 1  | 100
 3  | 1  | 20
 4  | 3  | 200

我试图找出一个村庄每人的平均订单数量。

我已经形成了查询,但它排除了那些没有下订单的村庄的人的结果。

我的查询:

SELECT
    v.vname,
    count(ok) / count(DISTINCT o.pk) AS avg
FROM
    v,
    o,
    p
WHERE
    p.pk = o.pk
AND p.vk = v.vk
GROUP BY
    v.vk;

我想要的是什么:

vname |  avg
  v1  |  1.5
  v2  |  1
  v3  |  0

我得到的是什么:

  vname |  avg
    v1  |  3
    v2  |  2

它没有考虑没有订单发生的第三个村庄,也没有人存在,但我希望它能够展示。此外,来自村庄1的人B没有下订单,因此,仅考虑来自村1中的人A的命令。

来自V1的人A的3个订单和V1的人2的3个订单,平均值必须是3/2但不包括另一个人并显示3/1是3。

关于我哪里出错以及如何完善查询的任何线索?

3 个答案:

答案 0 :(得分:1)

使用左连接和内连接

SELECT v.vname, count(ok)/count(distinct o.pk) AS avg 
FROM v
left join o on o.pk = p.pk
inner join p on p.vk = v.vk
group v.vname

答案 1 :(得分:0)

尝试使用LEFT JOIN代替archaic comma join

SELECT v.vname, NULLIF(count(ok)/count(distinct o.pk),0) AS avg 
FROM v
    LEFT JOIN p ON p.vk = v.vk
    LEFT JOIN o ON o.pk = p.pk
GROUP BY v.vname

答案 2 :(得分:0)

试试这个

select v.vname, NULLIF(count(o.ok)/count(p.pk),0)
from v
left join p on (v.vk = p.vk)
left join o on (p.pk = o.pk)
group by 1

你可能需要处理除以零的异常我猜