したがって、2つのテーブルがあります。1つは「質問」と呼ばれ、もう1つは「テスト」と呼ばれます。'questions'の各行には、列'id'、'test'、およびこの質問に関係のない他のいくつかの列があります。'tests'テーブルには、'id'、'name'、および関連のない他のいくつかの列があります。
基本的に、私のWebサイトでは、誰かがテストを作成するたびに、「tests」に新しい行が作成され、「id」が指定されます。そこから、ユーザーが行うすべての質問は、「questions」テーブルに新しい行を作成します。各質問には、「tests」テーブルの「id」と同じ番号の「id」列と「test」列が与えられます。それが属する。
昨日、誤って「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";
}
?>