Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果学生的出入境状态为“1”,则罚款将增加1;0“;地位_Php_Mysql - Fatal编程技术网

Php 如果学生的出入境状态为“1”,则罚款将增加1;0“;地位

Php 如果学生的出入境状态为“1”,则罚款将增加1;0“;地位,php,mysql,Php,Mysql,我有两个表,日志和学生日志,我想选择状态为“in”和“out”的学生id,状态为“0”。如果学生id有in和out,则学生中的惩罚计数将增加 日志 如果学生的状态为“0”,则惩罚将增加1。 日志 请帮我谢谢。试试这个 UPDATE student SET penalty_count = (penalty_count + 1) WHERE cardcode IN (SELECT GROUP_CONCAT(stud_id) FROM log WHERE status_log = 'IN' AND

我有两个表,日志和学生日志,我想选择状态为“in”和“out”的学生id,状态为“0”。如果学生id有in和out,则学生中的惩罚计数将增加

日志

如果学生的状态为“0”,则惩罚将增加1。 日志

请帮我谢谢。试试这个

UPDATE student SET penalty_count = (penalty_count + 1) 
WHERE cardcode IN 
(SELECT GROUP_CONCAT(stud_id) FROM log WHERE status_log = 'IN' AND status_log = 'OUT' 
AND status = 0 GROUP BY stud_id)
试着这样做:

UPDATE student 
SET penalty=penalty + 1
WHERE cardcode IN (
  SELECT l1.stud_id FROM log AS l1
  JOIN log AS l2 ON l1.stud_id=l2.stud_id AND l2.status_log = 'out' AND l2.status = 0
  WHERE l1.status_log = 'in' AND l1.status = 0
  GROUP BY l1.stud_id
)

这在没有连接说明的情况下也是可能的。您可以将此
键(stud\u id、status、status\u log)
添加到表日志中,以获得更好的性能

update 
 penalty
set
  penalty_count = penalty_count + 1 
where 
 cardcode IN(
   select 
     stud_id
   from 
    log
   where 
    status = 0
   group by 
    stud_id
   having 
    (sum(status_log = 'in') + sum(status_log = 'out')) = 2
   order by 
    null
)
注意,
order by null
用于禁用group by函数的默认排序(解释输出中的filesort),因为更新时不需要对结果进行排序


参见演示

学生
表中也应该有一个
螺柱id
。螺柱id是cardcode sir
UPDATE student 
SET penalty=penalty + 1
WHERE cardcode IN (
  SELECT l1.stud_id FROM log AS l1
  JOIN log AS l2 ON l1.stud_id=l2.stud_id AND l2.status_log = 'out' AND l2.status = 0
  WHERE l1.status_log = 'in' AND l1.status = 0
  GROUP BY l1.stud_id
)
update 
 penalty
set
  penalty_count = penalty_count + 1 
where 
 cardcode IN(
   select 
     stud_id
   from 
    log
   where 
    status = 0
   group by 
    stud_id
   having 
    (sum(status_log = 'in') + sum(status_log = 'out')) = 2
   order by 
    null
)