【发布时间】:2018-03-29 22:47:34
【问题描述】:
我正在尝试运行以下查询,以确定在特定日期我在某个区域有多少尚未预订的可用供应。为此,我按区域和可用天数生成所有工人的表格,并使用“位置”来确保他们“不在”当天确认的预订表格中。
我有两个问题:
-
这只能给我 1 天的剩余可用供应。我希望能够显示一系列天的剩余可用供应。例如。未来三天第 1 天、第 2 天和第 3 天的剩余可用供应。这意味着我必须迭代地将我的工人列表与每天的预订表进行比较。所以 col1 将计算工人 id '不在' Day1 的预订表中并且工人在 Day1s 工作,col2 将计算工人 id '不在' Day2 的预订表中并且工人在 Day2s 工作,......等等。
李> 这是一个较小的问题。给定下面的代码,如果可用供应的计数为 0,则该区域行不在结果表中。我曾尝试在计数上使用 IFNULL ,但这没有用。因此,我必须在它和一个查询之间创建一个联合,该查询列出所有具有 0 值的区域,然后选择每个具有最大值的区域。有没有更好的方法来做到这一点?
[daterange_start] 字段是由仪表板的最终用户替换的过滤字段。
select
area,
MAX(man_days_remaining)
from (
select doa.zip_code as area, count(w.user_ptr_id) as man_days_remaining
from domestic_worker w
left join domestic_worker_worker_operating_areas dwoa
on w.user_ptr_id = dwoa.worker_id
left join geography_operatingarea doa
on doa.id = dwoa.operatingarea_id
left join domestic_worker_days_available d
on w.user_ptr_id = d.worker_id
left join geography_city c
on c.id = w.worker_city_id
where w.user_ptr_id not in (
select w.user_ptr_id
from booking_booking b
left join domestic_jobcard j
on b.id = j.booking_id
left join domestic_worker w
on w.user_ptr_id = j.worker_id
where date(b.appointment_datetime) = date([daterange_start])
and b.booking_status = 'confirmed'
and w.user_ptr_id is not null)
and weekday([daterange_start]) + 1 = d.weekday_id
group by 1
UNION
select doa.zip_code as 'Area', '0', null
from geography_operatingarea doa
where doa.active = 1
) t
group by 1
order by 1 asc
【问题讨论】:
-
要获取日期范围,您可以在 where 中使用 between 子句,并将日期添加到 group by 和 columns由查询返回。
-
如果您编辑问题并添加所涉及表的架构,则可以完成更具体的答案。为了创建正确的查询,了解某些列的类型很重要。
-
另外,我怀疑 UNION 的原因是包含第一个查询中没有行的区域。我建议使用左连接来包含这些行。