簡體   English   中英

如何更新查詢兩個表並在一個表中更新?

[英]How do I update query two tables and update in one table?

我有兩個表candidatescandidate_subjects表,分別用於存儲候選人詳細信息和候選人分數。 如果候選人通過少於6個科目,我希望查詢將候選人備注更新為“失敗”。 要通過某個主題,該主題的ca_scoreexam_score候選總和必須大於40。

以下是我編寫的查詢,但未提供預期的結果:

UPDATE candidates SET candidates.remark='FAIL' WHERE (select 
    count(candidate_subjects.id) AS total_pass from candidates, 
    candidate_subjects where candidates.id=candidate_subjects.candidate_id 
    and (candidate_subjects.ca_score + candidate_subjects.exam_score) >= 40) < 6

表格:

CREATE TABLE candidate_subjects (
  id INT(10) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  candidate_id INT(11),
  exam_type_id INT(10),
  subject_id INT(10),
  ca_score INT(11),
  exam_score INT(6),
  score_grade VARCHAR(10),
  date_created VARCHAR(10),
  date_modified TIMESTAMP
);

INSERT INTO `candidate_subjects` (`id`, `candidate_id`, `exam_type_id`, 
`subject_id`, `ca_score`, `exam_score`, `score_grade`, `date_created`, 
`date_modified`) VALUES
  (1, 2, 1, 32, 22, 61, NULL, '2017-02-01', '2017-08-28 13:10:33'),
  (2, 2, 1, 5, 21, 38, NULL, '2017-02-01', '2017-08-28 13:10:33'),
  (3, 2, 1, 14, 21, 51, NULL, '2017-02-01', '2017-08-28 13:10:33'),
  (4, 2, 1, 1, 19, 34, NULL, '2017-02-01', '2017-08-28 13:10:33'),
  (5, 2, 1, 2, 23, 39, NULL, '2017-02-01', '2017-08-28 13:10:33'),
  (6, 2, 1, 38, 20, 32, NULL, '2017-02-01', '2017-08-28 13:10:33'),
  (7, 2, 1, 53, 24, 47, NULL, '2017-02-01', '2017-08-28 13:10:33'),
  (8, 4, 1, 32, 19, 61, NULL, '2017-02-01', '2017-08-28 13:11:27'),
  (9, 4, 1, 5, 22, 41, NULL, '2017-02-01', '2017-08-28 13:11:27'),
  (10, 4, 1, 14, 20, 46, NULL, '2017-02-01', '2017-08-28 13:11:27'),
  (11, 4, 1, 1, 23, 37, NULL, '2017-02-01', '2017-08-28 13:11:27'),
  (12, 4, 1, 2, 21, 36, NULL, '2017-02-01', '2017-08-28 13:11:27'),
  (13, 4, 1, 38, 22, 34, NULL, '2017-02-01', '2017-08-28 13:11:27'),
  (14, 4, 1, 53, 24, 52, NULL, '2017-02-01', '2017-08-28 13:11:27'),
  (15, 5, 1, 32, 20, 62, NULL, '2017-02-01', '2017-08-28 13:11:44'),
  (16, 5, 1, 5, 22, 38, NULL, '2017-02-01', '2017-08-28 13:11:44');


CREATE TABLE candidates (
  id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
  exam_no VARCHAR(15),
  surname VARCHAR(50),
  other_names VARCHAR(100),
  school_id INT(11),
  registration_completed INT(11),
  exam_scores_completed INT(5),
  remark VARCHAR(10)
);

INSERT INTO candidates (id, exam_no, surname, other_names, school_id,
registration_completed, exam_scores_completed, remark) VALUES
 (1, '1171052001', 'ABADO', 'MASENENGEN', 1052, 1, '1', ''),
 (2, '1170938001', 'AGBA', 'NGUHER', 938, 1, '1', ''), 
 (3, '1170071001', 'ABEE', 'SESUUR', 71, 1, '1', ''),
 (4, '1170938002', 'AHEN', 'REBECCA DOOSUUN', 938, 1, '1', '');

您可以嘗試以下方法嗎:

UPDATE candidates SET candidates.remark='FAIL' WHERE candidate_id IN (SELECT candidate_id FROM candidate_subject WHERE candidatescorecondition>40 HAVING COUNT(*) > 6);

請先在開發環境中運行!

要根據您的條件更新您的候選人,並且candidate_subjects記錄中的記錄存在於candidate_subjects您可以使用以下查詢。

UPDATE candidates c
JOIN (select 
    count(id) AS total_pass ,candidate_id
    from candidate_subjects 
    where(ca_score + exam_score) >= 40
    group by candidate_id
     ) a on c.id = a.candidate_id
SET c.remark='FAIL' 
WHERE total_pass < 6 

演示

如果考生可以不參加所有考試就被標記為FAIL ,則可以執行以下操作:

update candidates set remark='FAIL'
where id in (
  select candidate_id from candidate_subjects
  where ca_score+exam_score > 40 -- passed subject
  group by candidate_id having count(*)<6
)

但是如果候選人必須具有至少六個科目的數據才能進行評估,則需要添加一個附加條件(因此,如果候選人在過程中,則不會被標記為失敗):

update candidates set remark='FAIL'
where id in (
  select candidate_id from candidate_subjects
  where ca_score+exam_score > 40 -- passed subject
  group by candidate_id having count(*)<6
)
and id in (
  select candidate_id from candidate_subjects
  group by candidate_id having count(*)>=6 -- the candidate has data for at leas 6 subjects
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM