mysql:我有2张桌子。如何从每个学生的表A中获得 A级的COUNT,并更新表-B中的“A A Grades Achieved”列?
while($line = mysql_fetch_array($result)) {
$studentName = $line["Student"];
mysql_query("UPDATE table-B SET A Grades Achieved =
(SELECT COUNT(A) FROM Table-A
WHERE Grade = 'A' && Student ='$studentName')
WHERE Student ='$studentName' LIMIT 1");
答案 0 :(得分:1)
以下是您的查询:
UPDATE table-B
SET A Grades Achieved = (SELECT COUNT(A) FROM Table-A WHERE Grade = 'A' && Student ='$studentName')
WHERE Student ='$studentName'
LIMIT 1;
除了关于SQL注入的正常注释(您的代码容易出现它)和“mysql_”被弃用之外,您的查询还存在一些问题。主要问题是表和列的名称中包含需要转义的字符(即空格和连字符)。试试这个:
UPDATE `table-B`
SET `A Grades Achieved` = (SELECT COUNT(*) FROM `Table-A` WHERE Grade = 'A' AND Student = '$studentName')
WHERE Student = '$studentName'
LIMIT 1;
在设计数据库时,最好有简单的名称,因此不需要转义名称。
答案 1 :(得分:0)
您需要转义表名和列名,因为您使用了-
和空格字符(顺便说一句,这是一个坏主意)。你需要这个:
while($line = mysql_fetch_array($result)) {
$studentName = $line["Student"];
mysql_query("UPDATE `table-B` SET `A Grades Achieved` =
(SELECT COUNT(*) FROM `Table-A`
WHERE Grade = 'A' && Student ='$studentName')
WHERE Student ='$studentName' LIMIT 1");
另外,你真的应该使用准备好的陈述;这是一个主要的SQL注入风险。见"Little Bobby Tables."
最后,正如其他人所指出的那样,不推荐使用mysql_ *,你应该使用MySQLi或PDO。
答案 2 :(得分:0)
这实际上只能在SQL中完成:
UPDATE students AS s SET s.a_grades_achieved =
(SELECT COUNT(student) FROM tests AS t
WHERE t.student = s.name AND t.grade = 'A');
我冒昧地重命名了一些字段,所以你必须为你的应用程序修改它。您可以在this fiddle中看到它的工作原理。