我的查询表现得很奇怪......
首先,这是一个查询,以获取所有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
行,因为我知道在数据库中有一条消息toid
为1
,read
为0
, binned
为0
,但出于某种原因,上述查询返回0
行......
为什么会这样?
以下是我在Sequel Pro中看到的表结构的截图:
以下是Sequel Pro中的数据截图:
正如你所看到的那样,肯定有1条记录,其中toid为1,读为0并且分组为0。
这些是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将其用作关键字。
我打赌它显而易见的东西我很想念......
答案 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
编辑: 它应该是你的列在这个演示中的整数。
或者将值枚举为像这里的字符串
SELECT * FROM `pms`
WHERE `toid` = 1 AND `read` = '0' AND `binned` = '0'
答案 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。
答案 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中存储布尔值?