PHP使用NOT IN语句选择查询

时间:2012-12-24 21:35:53

标签: mysql sql

我对SELECT查询有些困难,应该相当容易。这是简化的背景:

我的数据库中有两个表。一个名为TABLE1的表包含三个字段:[QuestionID],[Question],[Answer]。第二个表名为TABLE2,包含两个字段:[UserID]和[QuestionID]。

基本上,页面的功能是当用户正确回答问题时,用户名和问题ID将插入到TABLE2中。 TABLE2将用于省略页面中已回答的问题,以便用户只能回答未回答的问题。

因此,SELECT查询应该通过'在 TABLE1 中显示 NOT IN TABLE2 '中的所有问题来工作。这听起来很容易,但我无法弄清楚。

这是我的疑问:

 $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时显示一个结果。

我将第一个查询放在'while'语句中,因为它返回了正确的数据(我在TABLE2中有两个条目用于测试目的,这就是echo语句显示的内容)。

所以我知道我做错了什么?

谢谢!

4 个答案:

答案 0 :(得分:1)

为什么不使用连接,我想知道?

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

使用此查询,您将从结果行集中有效地排除table2中没有相应行的所有table1条记录。

答案 1 :(得分:1)

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

您需要了解如何使用JOIN。我也不确定你是如何使用username的。此查询将显示TABLE1中不在TABLE2内的所有问题。

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

See it in action

答案 2 :(得分: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

这会返回Table1Table2

中没有相应记录的所有内容

答案 3 :(得分:0)

不要将QuestionID放在引号中!否则,MySQL将检查'QuestionID'中的字面值TABLE2,而不是列值。