我们在停车场的入口和出口有两个车牌读取器摄像头,当检测发生时,它们会生成一个 CSV 文件,然后自动加载到数据库中,入口处还有一个由停车场自动操作的屏障相机的“白名单”,反过来从数据库内生成和控制并导出到文本文件中。
这不是一个简单的三表数据库:
tbl_in : ID (autonum/PK), Plate, Date_in, Time_in
tbl_out: ID (Autonum/PK), Plate, Date_out, Time_out
tblwhitelist: Plate(PK), Country Code, Description
唯一的关系:
白名单车牌-Plate_in & Plate_out 白名单中的一个车牌可以在进出表中多次看到。
指定查询(括号显示列和正在考虑结果的基本逻辑):
如何整理查询码?
我同意草莓的帖子,你不需要两张桌子来放置
in
和out
。你可以有这样一个:
tblVehicleEvent : ID (autonum/PK), Plate, EventDate, EventTime, EventType
其中 EventType 的值为 IN 或 OUT。
或者您可以合并 TimeIn 和 TimeOut 以及 DateIn 和 DateOut,如下所示:
tblVehicleEvent : ID (autonum/PK), Plate, DateIn, DateOut, TimeIn, TimeOut
我认为第二个会更容易根据您的要求稍后查询。
查询如下:
今天现场已列入白名单车辆”(如果车牌在白名单上: 板、描述、Time_in、Time_out [如果板在 OUT 表上可见 今天,否则为空])
从 tblVehcileEvent V 中选择 W.Plate、描述、TimeIn、TimeOut
INNER JOIN tblWhitelist W
ON V 板 = W 板
WHERE DateIn = curdate()
“今天看到非白名单车辆”(如果车牌不在白名单上: Plate, Time_in,Time_out [如果在 OUT 表上看到板,否则 空])
选择板、计时、超时
来自 tblVehicleEvent
哪里车牌不在(从 tblWhitelist 中选择车牌)
“白名单车辆今日/过去 7 天/过去 30 天在现场的时间 天/过去 90 天(如果车牌在白名单上:车牌、描述、 Date_in、Time_in、Date_out、Time_out)这将有重复 现场多次录入相同车牌
选择 W.Plate、描述、超时、超时
来自 tblVehcileEvent V
INNER JOIN tblWhitelist W
ON V 板 = W 板
开始日期和结束日期之间的日期位置
“非白名单车辆今天/过去 7 天/过去 30 天在现场的时间 天/过去 90 天(如果车牌不在白名单中:车牌、Date_in、 Time_in、Date_out、Time_out)这将有重复的条目 现场多次使用相同的盘子
选择板、计时、超时
来自 tblVehicleEvent
哪里车牌不在(从 tblWhitelist 中选择车牌)
AND DateIn 介于开始日期和结束日期之间
就像草莓建议的那样,使用一个表,其中每条记录都跟踪车辆在公园中的完整停留时间。
tbl_stay
ID (autonum/PK), Plate, Date_in, Time_in, Date_out, Time_out
如果您使用两个不同的表,您将必须执行复杂的查询来关联数据。什么告诉您
tbl_in
中的一行与 tbl_out
中的另一行相关?您必须比较车牌号并找到最接近 Date_in / Time_in 的 Date_out / Time_out...
因此,只需使用单个表,但不要使用 Edper 的第一个建议,您最终会遇到同样的问题,这次根据事件类型过滤表并尝试将一行与另一行关联起来。
我认为你的第一个查询看起来像这样:
SELECT *
FROM tbl_whitelisted
INNER JOIN tbl_stay
ON tbl_whitelisted.Plate = tbl_stay.Plate
WHERE tbl_stay.Date_in <= curdate()
AND (tbl_stay.Date_out IS NULL OR tbl_stay.Date_out = curdate())
第二个是:
SELECT *
FROM tbl_stay
WHERE tbl_stay.Date_in <= curdate()
AND (tbl_stay.Date_out IS NULL OR tbl_stay.Date_out = curdate())
AND tbl_stay.Plate NOT IN (SELECT Plate FROM tbl_whitelist)
或者也许是这个(今天“看到”是什么意思?我猜这意味着车辆的车牌今天至少被扫描了一次,所以前面的版本不会这样做,因为它还返回今天仍在现场的车辆,但那是昨天...)
SELECT *
FROM tbl_stay
WHERE (tbl_stay.Date_in = curdate() OR tbl_stay.Date_out = curdate())
AND tbl_stay.Plate NOT IN (SELECT Plate FROM tbl_whitelist)