两个表之间的COUNT UPDATE

时间:2014-02-10 22:30:48

标签: php html mysql

mysql:我有2张桌子。如何从每个学生的表A中获得 A级的COUNT,并更新表-B中的“A A Grades Achieved”列?

enter image description here

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");

3 个答案:

答案 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中看到它的工作原理。