1

かなり簡単なはずの SELECT クエリに問題があります。簡略化された背景は次のとおりです。

データベースに 2 つのテーブルがあります。TABLE1 という名前の 1 つのテーブルには、[QuestionID]、[Question]、[Answer] の 3 つのフィールドが含まれています。TABLE2 という名前の 2 番目のテーブルには、[UserID] と [QuestionID] の 2 つのフィールドが含まれています。

基本的に、このページの機能は、ユーザーが質問に正しく答えると、ユーザー名と質問 ID が TABLE2 に挿入されることです。TABLE2 は、ユーザーが回答されていない質問のみに回答できるように、回答済みの質問をページから除外するために使用されます。

したがって、SELECT クエリは、「TABLE2にないTABLE1のすべての質問を表示する」ことで機能するはずです。これはとても簡単に聞こえますが、私には理解できません。

これが私のクエリです:

 $answered = mysql_query("SELECT QuestionID FROM TABLE2 WHERE Username='TESTING'");
 while ($answered1 = mysql_fetch_array($answered)) 
 {
 $QuestionsToDisplay = mysql_query("SELECT * FROM TABLE1 WHERE 'QuestionID' NOT IN ('$answered1')");
 }
 }

私も試しました:

$QuestionsToDisplay = mysql_query("SELECT * FROM TABLE1 WHERE 'QuestionID' !='$answered1'");

どちらのインスタンスも、4 を表示すべきときに 1 つの結果を表示します。

正しいデータが返されたので、最初のクエリを 'while' ステートメントに入れました (テスト目的で TABLE2 に 2 つのエントリがあり、これが echo ステートメントに表示されます)。

それで、私が間違っていることは何か分かりますか?

ありがとう!!

4

4 に答える 4

1

結合を使用しないのはなぜでしょうか?

    SELECT t2.QuestionID 
      FROM table2 t2 
INNER JOIN table1 t1 ON t1.QuestionID = t2.QuestionID
     WHERE t2.Username = 'TESTING'

このクエリを使用すると、table2対応する行を持たないすべてのレコードをtable1結果の行セットから効果的に除外できます。

于 2012-12-24T21:37:45.287 に答える
1

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

の使い方を学ぶ必要がありますJOIN。また、どのように使用しているのかわかりませんusernameTABLE1このクエリは、 にないの質問をすべて表示しますTABLE2

SELECT a.QuestionID
FROM TABLE1 a
LEFT JOIN TABLE2 b ON b.QuestionID = a.QuestionID
WHERE b.QuestionID IS NULL

実際に見る

于 2012-12-24T21:39:59.680 に答える
1

の使用を検討する必要があると思いますLEFT JOIN

SELECT t1.* 
FROM TABLE1 t1
LEFT JOIN TABLE2 t2
    ON t1.QuestionID = t2.QuestionID
    AND T2.Username = 'TESTING'
WHERE t2.QuestionId is null

Table1これは、対応するレコードがないものをすべて返しますTable2

于 2012-12-24T21:42:01.813 に答える
0

引用符を入れないQuestionIDでください!そうしないと、MySQL は、列の値ではなく、'QuestionID'のリテラル値をチェックします。TABLE2

于 2012-12-24T21:37:30.733 に答える