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


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

我有一个非常简单的问题(我认为),但我似乎找不到答案。我肯定我想太多了,但我还是想要洞察力。

使用MySQL,我想使用WHERE子句根据列在表中SELECT行,然后根据另一列优化该搜索。更具体地说,我希望返回来自某个特定用户的尚未存档的所有条目。

这是我今天的内容:

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

这是不工作,所以我尝试:

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

但这也行不通。

我是否需要从该用户返回所有条目,然后从该数组中删除所有具有"存档"值为"是"的条目,使用我的脚本语言循环或其他东西?

提前感谢您的帮助!

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

有几种方法来处理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

一个想法是将是或否的答案更改为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,我建议你阅读它