0

したがって、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";
}

?> 
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_*新しいコードで関数を使用しないでください。それらはもはや維持されておらず、公式に非推奨になっています。赤いボックスがか?代わりにプリペアドステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事はどちらを決定するのに役立ちます。PDOを選択した場合は、ここに優れたチュートリアルがあります。

于 2012-12-29T15:40:49.953 に答える