所以我有两个表,一个叫'问题',一个叫'测试'。 'questions'中的每一行都有列'id','test'和其他几个与此问题无关的列。 'tests'表有列'id','name'和其他几个不相关的列。
基本上,在我的网站上,每次有人创建测试时,都会在“测试”中创建一个新行,并给出一个“id”。从那里,用户提出的每个问题,在“问题”表中创建一个新行,每个问题都有一个'id'以及'test'列,其编号与'tests'表中的'id'相同它属于哪个。
昨天我们错误地从“测试”表中删除了几行,但是所有问题仍然在“问题”表中,这意味着我们只需要查找“问题”表中哪些行的“测试”值为没有链接到'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";
}
?>
答案 0 :(得分: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上的问题表中添加外键约束,以便在意外删除测试中的记录时防止出现同样的错误表。
答案 1 :(得分:0)
请务必将or die(mysql_error())
添加到mysql_*
功能的末尾,以便更容易识别任何问题。
另外,因为你是新人,所以这是来自社区的一点信息:
Please, don't use
mysql_*
functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDO或MySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial。