如何使用JOIN执行此操作

时间:2013-01-08 13:46:52

标签: sql

我有4张桌子。

tbl_person:
  - person_id
  - unique_id_number

tbl_plan:
  - plan_id
  - plan_name

tbl_person_plan:
  - id
  - person_id
  - plan_id
  - is_done

tbl_monitor_level:
  - id
  - unique_id_number
  - sugar_level
  - date_submitted

用户每天都会在tbl_monitor_level中输入数据。我只想检索所有unique_id_number,他们今天没有输入任何数据。

我用这个

select distinct tml.unique_id_number, count(tml.sugar_level) from 
tbl_person tp
right join
tbl_monitor_level tml on 
tml.unique_id_number = tp.unique_id_number
inner join tbl_person_plan tpp on 
tpp.person_id = tp.person_id
where tml.date_submitted = '2013-01-08'
group by tml.unique_id_number

但它只会获得带有date_submitted = 2003-01-08的所有unique_id_number 我希望得到这个

unique_id_number | count
-------------------------
G12345A          |   1
G23456B          |   0

但是因为它不会得到另一个unique_id_number (G23456B)。所有这些unique_id_numbers都存在于其他表中。

示例数据

 tbl_person
    - person_id - 1
    - unique_id_number - G12345A

    - person_id - 2
    - unique_id_number - G23456B

 tbl_plan
    - plan_id - 1
    - plan_name - Plan A

 tbl_person_plan
    - id - 1
    - person_id - 1
    - plan_id - 1
    - is_done - 0 

    - id - 2
    - person_id - 2
    - plan_id - 1
    - is_done - 0

 tbl_monitor_level
    - id - 1
    - unique_id_number - G12345A
    - sugar_level - 100
    - date_submitted - 2013-01-08

    - id - 2
    - unique_id_number - G12345B
    - sugar_level - 200
    - date_submitted - 2013-01-07

以上数据应该是结果。但我只是

unique_id_number | count
-------------------------
G12345A          |   1

1 个答案:

答案 0 :(得分:1)

LEFT JOIN应该按如下方式为您提供:

SELECT tp.unique_id_number, COUNT(tml.id) AS count
FROM tbl_person tp
LEFT JOIN tbl_monitor_level tml
  ON tp.unique_id_number = tml.unique_id_number
  AND tml.date_submitted = '2013-01-08'
GROUP BY tp.unique_id_number

主要区别在于您所做的LEFT与RIGHT JOIN,以及您需要在总是有条目的表上进行分组 - 在这种情况下为tbl_person。此外,WHERE子句需要合并到LEFT JOIN本身,以避免排除条目而不匹配监视行。

以下是sqlfiddle的工作原理。

UNIQUE_ID_NUMBER | COUNT
G12345A          | 1      
G23456B          | 0 

仅供参考,RIGHT JOIN几乎没有被使用,因为它们通常会使SQL逻辑比现在更混乱;)