这里有3个桌子mb_branchmb_itemmb_sell。而MB*来自Minibar。

  1. 我想列出mb_branch的所有分支名称,并根据给定的日期计数每个分支的项目。假设是2023-03-11
  2. 因此,我从mb_branch中选择所有br.name,并从mb_item计数所有行,其中uid与每个br.uid相关
  3. 我在mb_branch中有10行,但只显示2行。因为在1中给出的日期中存在项目。
  4. 我希望每个br.name显示即使在mb_item中也没有行或显示为0。

这是我的代码。

select
    br.*, br.name,
    count(it.id) as nit,
    sl.staff1 as st1,
    sl.staff2 as st2,
    sl.staff3 as st3,
    sl.money as money
from mb_branch br
left join mb_item it on it.uid=br.uid
left join mb_sell sl on sl.uid=br.uid
where date(it.dtime)=?
group by br.uid,date(it.dtime)
分析解答

您将it表上的条件放入WHERE子句中:

where date(it.dtime)=?

这消除了it没有匹配的任何outer-joined行,因为如果it.dtime是NULL,则条件当然会失败。

如果要限制outer-joined表的行,请将条件放在JOIN..ON中。

...
from mb_branch br
left join mb_item it on it.uid=br.uid and date(it.dtime)=?
left join mb_sell sl on sl.uid=br.uid
group by br.uid,date(it.dtime)