MySQL WHERE 子句选择值然后根据另一列省略一些值?

MySQL WHERE clause selects values then omits some based on another column?

我有一个非常简单的问题(我认为),但我似乎无法在任何地方找到答案。我确定我想多了,但我仍然希望有见识。

使用 MySQL,我想根据使用 WHERE 子句的列 table 中的 SELECT 行,然后根据另一列优化搜索.更具体地说,我想 return 尚未存档的特定用户的所有条目。

这是我今天的内容:

"SELECT * FROM entries WHERE user_id = '4' AND archived <> 'yes'";

这不起作用,所以我尝试了:

"SELECT * FROM entries WHERE (user_id = '4' AND archived <> 'yes')";

但这也没有用。

我是否需要 return 该用户的所有条目,然后使用 for 循环从该数组中删除所有具有 'archive' 值 'yes' 的条目,或者使用我的脚本语言的东西?

提前感谢您的帮助!

一个想法是将是或否的答案更改为 0/1 真假陈述。 使您的存档设置为 0,默认设置为 1,这样您就可以

$query = <<<SQL
   SELECT id,title,name,etc 
   FROM entries 
   WHERE user_id = :id 
   AND archived = :true
SQL;
   $results = $this->dbconn->prepare( $query );
   $results->execute( array (
       ':id'  => $_GET['id'],
       ':true'=> 1,
    ));
   if($results->rowCount() < 1) 
   {
   echo "No Unarchived for this user";
   }
   else {
    //Pull Unarchived Data
   }

您没有任何实际的 PHP 所以如果您不熟悉我发布的 PDO,我建议您阅读它。

如果 archived 列中有 NULL 个值,那么这些行将不满足不等式谓词。 (这是布尔三值逻辑的古老问题... TRUEFALSENULL。)

有几种方法可以处理 NULL 值,以便返回这些值。

作为一种选择,您可以使用(MySQL 特定的)NULL 安全比较运算符:<=>.

例如:

... WHERE user_id = '4' AND NOT (archived <=> 'yes')

这实际上等同于更符合 ANSI 标准的:

... WHERE user_id = '4' AND (archived <> 'yes' OR archived IS NULL)

参考:https://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#operator_equal-to