postgresql连接2个表和子查询,最后一个值<日期

时间:2017-04-18 05:39:47

标签: sql postgresql join

我有3张桌子:bill_plans, biling_types, users

样本数据

Bill_plans

id, user_id, bill_plan_value, bill_type_id, bill_plan_date
1   1        100              7             2017-04-13
2   1        50               4             2017-03-13
3   1        70               7             2017-03-24
4   1        28               3             2017-02-21

Billing_types

id, bill_type,  parent_id
3   Платний             1
4   Безплатний          1
5   Адміністративний    2
6   Маркетинговий       2
7   Розвитку            2
2   Внутрішній білінг   0
1   Клієнтський білінг  0

用户

id, name
1, Адмін
2, Carl
3, Peter

需要

id, user_id, bill_plan_value, bill_type_id, bill_plan_date, bill_type,  name
1   1        100              7             2017-04-13      Розвитку   Адмін
2   NULL     NULL             6             NULL            Маркетинговий   Адмін
3   NULL     NULL             5             NULL            Адміністративний   Адмін
4   NULL     NULL             4             NULL            Безплатний   Адмін
5   NULL     NULL             3             NULL            Платний      Адмін

与其他用户相同

试图跑

SELECT b.*, bt.*, u.name
FROM bill_plans as b
FULL JOIN billing_types as bt ON bt.id = b.bill_type_id
FULL JOIN users as u ON u.id = b.user_id
WHERE EXTRACT (MONTH FROM b.bill_plan_date) = $dateMonth OR
      b.bill_plan_date IS NULL AND bt.parent_id != 0 OR bt.parent_id IS NULL

获得

[0]=>
  array(8) {
    ["id"]=>
    int(7)
    ["user_id"]=>
    int(1)
    ["bill_plan_value"]=>
    string(3) "100"
    ["bill_type_id"]=>
    int(7)
    ["bill_plan_date"]=>
    string(10) "2017-04-13"
    ["bill_type"]=>
    string(16) "Tax"
    ["parent_id"]=>
    int(2)
    ["name"]=>
    string(10) "User1"
  }
  [1]=>
  array(8) {
    ["id"]=>
    int(5)
    ["user_id"]=>
    NULL
    ["bill_plan_value"]=>
    NULL
    ["bill_type_id"]=>
    NULL
    ["bill_plan_date"]=>
    NULL
    ["bill_type"]=>
    string(33) "Administration"
    ["parent_id"]=>
    int(2)
    ["name"]=>
    NULL
  }

[0]是正确的,但是下一个结果会返回NULL用户。我需要所有用户和所有用户的账单,即使bill_plan为用户空了。

第二步 - 获取最后一个值

需要从 bill_plans 获取最后一个值,其中bill_plan_date< $ date(最近)

1 个答案:

答案 0 :(得分:0)

CROSS JOIN

SELECT b.*, bt.*, u.name
FROM bill_plans as b
RIGHT JOIN billing_types as bt ON bt.id = b.bill_type_id
CROSS JOIN users as u ON u.id = b.user_id
WHERE EXTRACT (MONTH FROM b.bill_plan_date) = $dateMonth 
      OR b.bill_plan_date IS NULL 
      AND bt.parent_id != 0 
      OR bt.parent_id IS NULL