Php PDO准备的声明似乎忽略了HAVING子句

Php PDO准备的声明似乎忽略了HAVING子句,php,mysql,pdo,mariadb,Php,Mysql,Pdo,Mariadb,。这将返回我期望的结果,与我在PDO中看到的结果不同 我有以下缩小的表视图和查询: CREATE TABLE `tagged` { `tag` SMALLINT(5) UNSIGNED NOT NULL } 表中有各种各样的值,但您可以对数据库中的标记使用1-10: INSERT INTO tagged (tag) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10) 查询: SELECT tagged.tag, (

。这将返回我期望的结果,与我在PDO中看到的结果不同

我有以下缩小的表视图和查询:

CREATE TABLE `tagged` {
    `tag` SMALLINT(5) UNSIGNED NOT NULL
}
表中有各种各样的值,但您可以对数据库中的标记使用1-10:

INSERT INTO tagged (tag) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
查询:

SELECT tagged.tag,
    (@t := :tag),
    @t AS temp_var,
    (@t IS NULL OR FIND_IN_SET(tagged.tag, @t) > 0) AS is_match
FROM tagged
HAVING is_match = 1
LIMIT 150
当在客户机、命令行、jdbc等中运行时,这似乎很好。如果输入
'
NULL
,我会得到所有结果。类似地,
'1'
的输入只产生
1
的标签,而
'1,4'
的输入将检索所有带有1或4的标签

查询限制这些结果的方式是通过
HAVING
子句中的
is_match=1
。使用PDO运行时,参数似乎绑定正确,但它完全忽略了子句中的条件:

Array
(
    [0] => stdClass Object
        (
            [tag] => 3
            [(@t := ?)] => 1,4
            [temp_var] => 1,4
            [is_match] => 0     ## should not have been returned
        )

    [1] => stdClass Object
        (
            [tag] => 4
            [(@t := ?)] => 1,4
            [temp_var] => 1,4
            [is_match] => 1
        )
用于运行此操作的PHP代码(简化):


有什么我遗漏的吗?我绑定了一个直接字符串参数,似乎临时变量已经存在并且设置正确。为什么PDO返回
匹配的元素的结果

在缺少
GROUP BY
子句的情况下,似乎在某些情况下,整个结果可以被视为“一组”。由于结果中的一行满足
的条件,因此应全部通过

补充阅读:

p、 我认为没有必要使用
>0

我想我会这样写你的问题:

SELECT tag,
    @t := '1,4' AS temp_var,
    1 AS is_match
FROM tagged
WHERE @t IS NULL OR FIND_IN_SET(tag, @t)
LIMIT 150;

DB::queryOf()
-这不是PDF。您应该告诉我们您正在使用哪个库。它不是一个库,只是我编写的一个函数,它加载一个
.sql
文件(在本例中名为
test.sql
)。实际上只是一个
文件获取内容的调用。这个问题当然是在问题中。没有ORDERBY子句,这一切都是毫无意义的。请参阅:您是否尝试过任何带有HAVING子句的简单查询?很抱歉但你的例子并不完整,也太复杂。这个查询对我来说毫无意义。这是出现问题的简化查询,执行类似于
SELECT taged.tag FROM taged have taged=1的操作将在PDO中正确执行@如果我的理解(只是最近通过研究这个问题才发现)不正确,我可以很高兴地编辑或删除我的帖子。您可能希望测试没有行满足的其他条件。我现在正在测试一些东西,对于我提供的示例查询,这似乎是一个合理的解决方案。我现在正在尝试将解决方案调整到我的实际查询(因为涉及多个表)中,以查看这是否可以修复PDO。您在两个方面都是正确的(
>0
已删除,有意义)。为了使其适应我的查询,我最终不得不在查询中附加一个分组条件,该条件现在看起来像是
groupbymedia\u source.name,media.id,taged.media
(其中
taged.media
是我们讨论的标记表中使用的媒体标识符)。然而,这完全修复了我在
中使用的比较,特别是针对PDO的
子句。鬼东西!我已经在一个修改过的查询上添加了我的想法,但是它对于您的实际项目需求来说可能太基本了。您说它依赖于RDBMS。OP说这取决于客户端(PHP-PDO)。这是一个有趣的协议。顺便说一句:修改后的查询仍然没有意义。使用
从标记中选择标记,其中标记位于(1,4)
,也可以实现同样的效果。
SELECT tag,
    @t := '1,4' AS temp_var,
    1 AS is_match
FROM tagged
WHERE @t IS NULL OR FIND_IN_SET(tag, @t)
LIMIT 150;