返回

MySQL LEFT JOIN 巧用空连接,巧妙记录 RFID 工作时间

mysql

MySQL 中使用 INSERT 和空连接

问题

需要使用 MySQL 数据库记录通过连接到 Raspberry Pi 的 RFID 读卡器注册的工作时间。问题在于,个人姓名不会直接与 RFID 卡的 key_id 关联,因此无法在不丢失过去记录的情况下重新使用 RFID 卡。

解决方法

使用 LEFT JOIN 查询可以解决这个问题。LEFT JOIN 查询将从 Connection 表中检索所有行,无论 key_id 是否匹配。然后,它将这些行与 Registration 表连接起来,并为没有匹配项的行返回 NULL 值。

修改后的查询

INSERT INTO Registration (key_id, User_Id, TimbraData, TimbraStato, TimbraHH)
SELECT
  'XXXXXXXX',
  Connection.User_Id,
  '2024-03-19',
  'E',
  '18.40'
FROM Connection
LEFT JOIN Registration
  ON Connection.key_id = Registration.key_id
WHERE
  Registration.key_id IS NULL;

解释

  • LEFT JOIN 将检索 Connection 表中的所有行,无论 key_id 是否匹配。
  • Registration.key_id IS NULL 条件确保仅选择没有匹配项的行。
  • 对于没有匹配项的行,User_Id 将被设置为 NULL。

其他注意事项

  • 还可以通过在 Connection 表中创建一个新列来存储 User_Id,即使 key_id 丢失,也可以跟踪 User_Id
  • 应该考虑使用触发器或存储过程来处理新卡的分配和记录插入。

常见问题解答

  1. 为什么使用 LEFT JOIN 而不是 JOIN?
    JOIN 将仅返回具有匹配 key_id 的行,而 LEFT JOIN 将返回所有行,包括 key_id 匹配的和不匹配的。
  2. 为什么需要设置 User_Id 为 NULL?
    当没有匹配项时,需要设置 User_Id 为 NULL,以便在 Registration 表中记录新卡。
  3. 如何处理没有 key_id 的新卡?
    在插入 Registration 表之前,新卡需要分配一个 key_id。这可以通过使用触发器或存储过程来完成。
  4. 如何更新 Registration 表中的记录?
    可以使用 UPDATE 查询来更新 Registration 表中的记录。
  5. 如何删除 Registration 表中的记录?
    可以使用 DELETE 查询来删除 Registration 表中的记录。