0

我有 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
4

1 回答 1

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 逻辑比现在更加混乱;)

于 2013-01-08T13:52:17.603 回答