MySQL AND关键字问题

时间:2013-01-27 16:50:30

标签: mysql

我的查询表现得很奇怪......

首先,这是一个查询,以获取所有PM,无论他们是否已被读取或删除用户ID 1:

SELECT * FROM `pms` WHERE `toid` = '1'

按预期返回3行。接下来,让我们看看我是否只能获得此用户的未读消息:

SELECT * FROM `pms` WHERE `toid` = '1' AND `read` = '0'

按预期返回2行。让我们看看我是否可以获取已被分箱的任何读取和未读消息:

SELECT * FROM `pms` WHERE `toid` = '1' AND `binned` = '0'

按预期返回2行。

我需要运行的查询是获取指定用户ID的所有未读和未分箱消息。要做到这一点,我这样做:

SELECT * FROM `pms` WHERE `toid` = '1' AND `read` = '0' AND `binned` = '0'

但是,它应该返回1行,因为我知道在数据库中有一条消息toid1read0binned0,但出于某种原因,上述查询返回0行......

为什么会这样?


更新

以下是我在Sequel Pro中看到的表结构的截图:

screenshot

以下是Sequel Pro中的数据截图:

screenshot2

正如你所看到的那样,肯定有1条记录,其中toid为1,读为0并且分组为0。


更新2

这些是ENUM的原因是因为我希望在MySQL中存储一个布尔值。我这样做是通过强制列为“1”或“0”并使其默认为“0”。如果有人有更好的方法在MySQL中存储布尔值,那么我很乐意学习。

其次,这是我的User.class.php文件中的PHP函数,它使用此SQL获取未读计数。应该返回0时,此函数返回1$this->getUserId()正在返回1,因为这是我正在使用的当前用户:

public function getUnreadCount()
{
    global $database;
    $sql = "SELECT * FROM `pms` WHERE `toid` = '".$this->getUserID()."' AND `read` = '0' AND 'binned' = '0'";
    $query = $database->query($sql);
    $count = $database->count($query);
    return $count;
}

感谢您的帮助到目前为止,但我仍然无法解决为什么这不起作用。我在查询中使用read添加反引号以防止MySQL将其用作关键字。

我打赌它显而易见的东西我很想念......

4 个答案:

答案 0 :(得分:1)

詹姆斯,我认为这个问题可能与表格的填充方式有关。

由于“read”和“binned”列的数据类型是ENUM,因此您可能必须设置正确的默认值(“0”或“1”),或者在向此表中插入行时始终提供有效值。换句话说,在插入“pms”-row时,不能省略“read”或“binned”列的值。

换句话说,如果你的“pms”表设置如下,没有默认值:

create table pms (
  toid int,
  `read` ENUM('0','1') ,
  binned ENUM('0','1') 
  );

然后你必须插入完全指定的行值,如下所示:

insert into pms (toid, `read`, binned) values
  (1, '0', '0'),
  (1, '0', '1'),
  (1, '1', '0'),
  (1, '1', '1')
;

避免插入稀疏数据,如下所示:

insert into pms (toid) values (1);
insert into pms (toid, binned) values (1, '1');
insert into pms (toid, `read`) values (1, '1');
insert into pms (toid, `read`, binned) values (1, '1', '1');

为这些列提供正确的默认枚举值也可以解决此问题:

create table pms (
  toid int,
  `read` ENUM('0','1') default '0',
  binned ENUM('0','1') default '0' 
  );

我已设置sqlfiddle来说明。

答案 1 :(得分:0)

如果您的列是整数,请尝试执行此操作

   SELECT * FROM `pms` WHERE `toid` = 1 AND `read` = 0 AND `binned` = 0

编辑: 它应该是你的列在这个演示中的整数。

SQLFIDDLE DEMO

或者将值枚举为像这里的字符串

 SELECT * FROM `pms` 
WHERE `toid` = 1 AND `read` = '0' AND `binned` = '0'

sqllfiddle demo

答案 2 :(得分:0)

尝试测试您是否正确设置了变量。我建议通过测试在查询一个变量时是否得到正确的结果。:

SELECT * FROM `pms` WHERE `toid` = '1'; -- 3;

SELECT * FROM `pms` WHERE `read` = '0'; -- 4;

SELECT * FROM `pms` WHERE `binned` = '0'; -- 4;

经典错误是您使用整数值而不是字符串(ENUM)值或将零替换为null。

SQL FIDDLE DEMO

答案 3 :(得分:0)

哇哈哈,我刚刚发现为什么它没有返回行。

我在SQL查询的PHP实现中错误地使用单引号而不是反引号...

所以我的查询实际上是:

$sql = "SELECT * FROM `pms` WHERE `toid` = '".$this->getUserID()."' AND `read` = '0' AND 'binned' = '0'";

什么时候应该:

$sql = "SELECT * FROM `pms` WHERE `toid` = '".$this->getUserID()."' AND `read` = '0' AND `binned` = '0'";`

正如您所看到的,在binned的查询结尾附近,我错误地使用了单引号。

你能相信这么简单吗?

出于兴趣,您认为我应该如何在MySQL中存储布尔值?