0

我有一个行为奇怪的查询...

首先,这是一个查询,用于获取所有 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行,因为我知道在数据库中有一条带有toidas 1readas0binnedas的消息,0但是由于某种原因,上面的查询正在返回0行...

为什么是这样?


更新

这是我在 Sequel Pro 中看到的表格结构的屏幕截图:

截屏

这是在 Sequel Pro 中看到的表格内数据的屏幕截图:

截图2

如您所见,肯定有 1 条记录,tid 为 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

4 回答 4

1

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

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

于 2013-01-27T17:32:19.723 回答
0

如果您的列是整数,请尝试这样做

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

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

SQLFIDDLE 演示

或将值作为字符串枚举,如这里

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

sqllfiddle 演示

于 2013-01-27T17:21:55.520 回答
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 中存储布尔值?

于 2013-01-27T21:53:59.760 回答
0

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

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

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

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

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

SQL 小提琴演示

于 2013-01-27T18:20:56.123 回答