我们在停车场的入口和出口处有两个车牌阅读器摄像头,当检测到时会生成一个CSV文件,然后自动加载到数据库中,以及自动进入的入口屏障通过相机的“白名单”,然后从数据库中生成和控制并导出到文本文件中。
最初,根据下面的设计,我认为这将是一个简单的3表数据库,但我很快意识到情况并非如此:
我最初的设计:
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 其中白名单中的一个板可以在内部和外部多次看到。出桌
这已经变得更加复杂了(这是我的大脑真正融化的地方!)已经指定的查询(括号显示列和基本逻辑正在考虑结果):
我真正需要帮助的是关于如何整理查询代码以使这些正常工作的一些想法。这是我在这个项目中的最后一个主要障碍之一。不幸的是,这是珠穆朗玛峰的一个障碍。非常感谢您提供的任何帮助!
答案 0 :(得分:0)
我同意Straweberry的帖子,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
我认为第二个更容易根据您的要求进行查询。
查询如下:
今日白色车辆现场“(IF板块在白名单上: Plate,Description,Time_in,Time_out [如果在OUT表上看到的板 今天,否则为null])
SELECT W.Plate,Description,TimeIn,TimeOut FROM tblVehcileEvent V
INNER JOIN tblWhitelist W
ON V.Plate = W.Plate
WHERE DateIn = curdate()
“今天看到的非白名单车辆”(IF版不在白名单上: Plate,Time_in,Time_out [如果在OUT表上看到板,否则 空])
SELECT Plate,TimeIn,TimeOut
从tblVehicleEvent
板块不在(从TblWhitelist选择板块)
“白名单车辆在今天/过去7天/过去30天的现场时间 天/最近90天(白名单上的IF板块:板块,描述, Date_in,Time_in,Date_out,Time_out)这将有重复 在现场多次进行相同板块的条目
SELECT W.Plate,Description,TimeIn,TimeOut
来自tblVehcileEvent V
INNER JOIN tblWhitelist W
ON V.Plate = W.Plate
在哪里DateIn BETWEEN startDate和EndDate
“非白名单车辆在今天/过去7天/过去30天的现场时间 天/最近90天(IF版不在白名单上:Plate,Date_in, Time_in,Date_out,Time_out)这将有重复的条目 在现场多次使用相同的板材
SELECT Plate,TimeIn,TimeOut
从tblVehicleEvent
盘子不在(从TblWhitelist选择板)
AND DateIn BETWEEN startDate和EndDate
答案 1 :(得分:0)
像草莓建议的那样,使用一张桌子,每张记录跟踪车辆在公园内的完整停留时间。
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)