PDO에서 준비한 문이 HAVING 절을 무시하는 것 같습니다.
DB-fiddle을 포함했으므로 입력 파라미터를 적절히 조정할 수 있습니다.이것은 내가 기대하는 대로 되돌아가며 PDO에서 볼 수 있는 결과와 다릅니다.
다음과 같은 상세 테이블 뷰와 쿼리를 가지고 있습니다.
CREATE TABLE `tagged` {
`tag` SMALLINT(5) UNSIGNED NOT NULL
}
Table에는 다양한 값이 있지만 DB의 태그에는 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의 모든 태그를 가져옵니다.
쿼리가 이러한 결과를 제한하는 방법은is_match = 1
에서HAVING
절을 클릭합니다.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 코드(간소화):
$conn = /* pdo connection object */;
$stmt = $conn->prepare(DB::queryOf('test')); //uses our above query from a file
$stmt->bindValue(':tag', $args['tag'], PDO::PARAM_STR); //hardcode binding '1,4'
$stmt->execute(); //also tried plain #execute($args)
return $stmt->fetchAll(PDO::FETCH_OBJ);
제가 놓친 게 있나요?직접 문자열 매개 변수를 바인딩하고 있는데 임시 변수가 있고 올바르게 설정되어 있는 것 같습니다.PDO가 다음과 같은 요소에 대한 결과를 반환하는 이유는 무엇입니까?is_match
=0
?
이 동작은 사용하는 RDBMS에 따라 다르다고 생각합니다.
이 없는 경우GROUP BY
조항, 경우에 따라서는 전체 결과를 "하나의 그룹"으로 간주할 수 있는 것으로 보인다.결과의 한 행이 다음을 만족하기 때문입니다.HAVING
조건, 모든 것이 통과될 것이다.
추가 판독치:
SQL 쿼리에서 GROUP BY 없는 HAVING 사용
p.s. 제 생각엔> 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;
언급URL : https://stackoverflow.com/questions/54748944/pdo-prepared-statement-seems-to-ignore-having-clause
'source' 카테고리의 다른 글
외부 키를 사용하는 것이 좋습니까, 아니면 고유 ID를 할당하는 것이 좋습니까? (0) | 2022.11.13 |
---|---|
유형이 x인 동일한 테이블에 엔트리가 포함된 유형이 y인 행을 모두 삭제하려면 어떻게 해야 합니까? (0) | 2022.11.13 |
Python에서 "assert"의 용도는 무엇입니까? (0) | 2022.11.13 |
SELECT INTO 및 "미등록 변수" 오류 (0) | 2022.11.13 |
JavaScript 콘솔에 jQuery 포함 (0) | 2022.11.13 |