整理停车场数据库设计的具体查询[已关闭]

问题描述 投票:0回答:2

我们在停车场的入口和出口有两个车牌读取器摄像头,当检测发生时,它们会生成一个 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 白名单中的一个车牌可以在进出表中多次看到。

指定查询(括号显示列和正在考虑结果的基本逻辑):

  1. “今天现场白名单车辆”(如果车牌在白名单上:车牌、描述、Time_in、Time_out [如果车牌今天在 OUT 表中看到,否则为空])
  2. “今天看到非白名单车辆”(如果车牌不在白名单上:Plate、Time_in、Time_out [如果车牌在 OUT 表中看到,否则为 null])
  3. “白名单车辆今天/过去 7 天/过去 30 天/过去 90 天的现场时间(如果白名单上的车牌:车牌、描述、日期_入、时间_入、日期_出、超时)这将具有相同车牌的重复条目现场多次
  4. “非白名单车辆今天/过去 7 天/过去 30 天/过去 90 天的现场时间(如果车牌不在白名单上:车牌、日期_入、时间_入、日期_出、超时)这将具有相同车牌的重复条目现场多次

如何整理查询码?

mysql database database-design
2个回答
0
投票

我同意草莓的帖子,你不需要两张桌子来放置

in
out
。你可以有这样一个:

 tblVehicleEvent : ID (autonum/PK), Plate, EventDate, EventTime, EventType

其中 EventType 的值为 INOUT

或者您可以合并 TimeIn 和 TimeOut 以及 DateIn 和 DateOut,如下所示:

 tblVehicleEvent : ID (autonum/PK), Plate, DateIn, DateOut, TimeIn, TimeOut

我认为第二个会更容易根据您的要求稍后查询。

查询如下:

  1. 今天现场已列入白名单车辆”(如果车牌在白名单上: 板、描述、Time_in、Time_out [如果板在 OUT 表上可见 今天,否则为空])

    从 tblVehcileEvent V 中选择 W.Plate、描述、TimeIn、TimeOut
    INNER JOIN tblWhitelist W
    ON V 板 = W 板
    WHERE DateIn = curdate()

  2. “今天看到非白名单车辆”(如果车牌不在白名单上: Plate, Time_in,Time_out [如果在 OUT 表上看到板,否则 空])

    选择板、计时、超时
    来自 tblVehicleEvent
    哪里车牌不在(从 tblWhitelist 中选择车牌)

  3. “白名单车辆今日/过去 7 天/过去 30 天在现场的时间 天/过去 90 天(如果车牌在白名单上:车牌、描述、 Date_in、Time_in、Date_out、Time_out)这将有重复 现场多次录入相同车牌

    选择 W.Plate、描述、超时、超时
    来自 tblVehcileEvent V
    INNER JOIN tblWhitelist W
    ON V 板 = W 板
    开始日期和结束日期之间的日期位置

  4. “非白名单车辆今天/过去 7 天/过去 30 天在现场的时间 天/过去 90 天(如果车牌不在白名单中:车牌、Date_in、 Time_in、Date_out、Time_out)这将有重复的条目 现场多次使用相同的盘子

    选择板、计时、超时
    来自 tblVehicleEvent
    哪里车牌不在(从 tblWhitelist 中选择车牌)
    AND DateIn 介于开始日期和结束日期之间


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)
© www.soinside.com 2019 - 2024. All rights reserved.