我有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
答案 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逻辑比现在更混乱;)