0

所以我有两张桌子,一张叫做“问题”,一张叫做“测试”。“问题”中的每一行都有“id”、“test”列和与该问题无关的其他几列。'tests' 表有列 'id'、'name' 和其他几个不相关的列。

基本上,在我的网站上,每次有人创建测试时,都会在“测试”中创建一个新行,并给它一个“id”。从那里,用户提出的每个问题,都会在“问题”表中创建一个新行,每个问题都有一个“id”以及与“测试”表中的“id”具有相同编号的“测试”列它所属的。

昨天我们错误地从'tests'表中删除了几行,但是所有的问题仍然在'questions'表中,这意味着我们只需要找到'questions'表中的哪些行的'test'值不是链接到 'tests' 表中的任何 'id',所以这是我们想出的 .php 脚本:

<?php
$conn = mysql_connect ('localhost', 'hidden',  'hidden') or die ('Error connecting');
if (!$conn) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('hidden', $conn);
$sql = "SELECT * FROM questions";
$result = mysql_query($sql,$conn);

while ($row = mysql_fetch_array($result)) {
    $test = $row['test'];
    $questionID = $row['id'];
    $sql2 = "SELECT * FROM tests where id = $test";
    $result2 = mysql_query($sql2, $conn);
    $row2 = mysql_fetch_array($result2);
    $num_rows = mysql_num_rows($result2);
    if ($num_rows == 0) {
        echo "Unlinked question: $questionID (test $test) <br/>";
    }
}
?>

但是,它不会回显任何“未链接的问题..”,这将帮助我们确定哪些测试我们丢失并需要重新创建,为它们提供正确的“id”以链接到“问题”表的“测试”列。有没有其他方法可以解决这个问题?是的,我们确实备份了表格,但不幸的是我们每隔一周才做一次,而且大部分删除的测试都是最近的。

更新:

$sql = "
SELECT q.id AS QuestionID
FROM questions q
LEFT JOIN tests t
ON  (q.test = t.id)
WHERE q.test IS NOT NULL AND t.id IS NULL";

$result = mysql_query($sql,$conn) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
$questionID = $row['QuestionID'];
$testID = $row['test'];
echo $row;
echo "The question with the id: $questionID is not linked to the test: $testID";
}

?> 
4

2 回答 2

1

为什么不在一条 SQL 语句中执行此操作?

SELECT
    q.id AS QuestionID,
    CASE WHEN q.test IS NOT NULL AND t.id IS NULL THEN 1 ELSE 0 END AS UnlinkedQuestion
FROM
    questions q
LEFT JOIN
    tests t
    ON  (q.test = t.id)

或者,如果您只想返回未链接的问题 ID,只需将逻辑移动到 WHERE 子句中:

SELECT
    q.id AS QuestionID
FROM
    questions q
LEFT JOIN
    tests t
    ON  (q.test = t.id)
WHERE
    q.test IS NOT NULL AND
    t.id IS NULL

笔记:

我强烈建议您在测试 id 上的问题表中添加外键约束,这样您就可以防止意外从测试表中删除记录时出现同样的错误。

于 2012-12-29T15:37:33.400 回答
0

请记住添加or die(mysql_error())mysql_*函数的末尾,以便更容易识别任何问题。

请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程

于 2012-12-29T15:40:49.953 回答