我正在开发一种工具来记录工人的来来往往时间。这些时间记录在一个mysql表中。
该表有一个come
和一个gone
字段,用于在工人来或离开时进行注册。
只有新的条目,如果所有" old"条目已关闭,表示工人已经签出。
我认为应该是这样的:
IF EXISTS ( SELECT * FROM tbl_card
WHERE time_gone IS NULL
AND user_id=".$user_id."
)
THEN
BEGIN
END
ELSE BEGIN
INSERT
INTO tbl_card (`user_id`, `time_come`)
VALUES ('2', '2018-01-01 14:00')
END
有没有人知道这应该如何运作?
我使用php来查询mysql。 Php允许定义" if-conditions",因此我在SELECT * FROM tbl_card...
中分隔查询并测试rowcount
是否为' 0'然后我执行了插入。
但是:一位用户设法使用第一次和第二次查询之间的微秒来签到两次。 :(
用于LAMP环境。 在此之前:
$sql = "SELECT * FROM tbl_card WHERE time_gone IS NULL
AND user_id=".$user_id;
$result = $db_conn->query($sql);
if ($result->num_rows <> 0)
{
return 'You already checked in!';
}
else
{
$sql = "INSERT
INTO tbl_card(`user_id`, `time_come`)
VALUES ('".$user_id."', '".$timestamp."')";
if ($db_conn->query($sql)){
return 'Check in: '.$timestamp;}
else
{
return 'Something strange happend!';
}
}
表格是:
tbl_card -> id, user_id, time_come, time_gone
tbl_user -> id, name
答案 0 :(得分:4)
尝试单个插入/选择:
INSERT INTO card (`user_id`, `time_come`)
SELECT '2', '2018-01-01 14:00'
WHERE NOT EXISTS
( SELECT * FROM punchclock
WHERE time_gone IS NULL
AND user_id=".$user_id."
)
答案 1 :(得分:1)
INSERT INTO tbl_card (`user_id`, `time_come`)
SELECT * FROM (SELECT '2', '2018-03-27 15:15') AS tmp
WHERE NOT EXISTS (
SELECT * FROM tbl_card
WHERE `time_gone` IS NULL
AND `user_id`=`2`
) LIMIT 1;
答案 2 :(得分:0)
感谢 dnoeth 指导我找到最终解决方案:
INSERT INTO tbl_card (`user_id`, `time_come`)
SELECT '2', '2018-01-01 14:00' FROM dual
WHERE NOT EXISTS
(
SELECT * FROM tbl_card
WHERE time_gone IS NULL
AND user_id=".$user_id."
)
dual 是一个虚拟表,在mysql中实现,不需要表。
这个解决方案模拟了来自另一个表的数据插入,这个数据并不是真正存在的,只有静态的值&#39; 2&#39;和&#39; 2018-01-01 14:00&#39;对于每一行。行的数量由查询的WHERE部分给出。
有时候mysql和它的用户会让我感到惊讶。 :d 我想知道为什么我不需要&#34; VALUES&#34; -command,但它运行良好。
让我们看看用户是否可以&#34;覆盖&#34;该查询也是:D