使用PHP在两个不同的mysql表中查找未链接的列

时间:2012-12-29 15:32:45

标签: php mysql database

所以我有两个表,一个叫'问题',一个叫'测试'。 '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";
}

?> 

2 个答案:

答案 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,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial