如何解决UNION ALL的数组绑定问题
我正在尝试使用UNION ALL联接多个查询。
我尝试了以下代码。出现错误Invalid parameter number: number of bound variables does not match number of tokens
。
$code = '1,2,3,4';
$codeArray = explode(',',$code);
$inQuery = implode(',array_fill(0,count($codeArray),'?'));
$full_dt = date('Y-m-d H:i:s');
$start_date = "2020-08-28 14-44-23";
$medication = "OD";
$query = "SELECT SUM(counts) AS allcounts FROM
(SELECT COUNT(b.id) AS counts
FROM pat_info a
INNER JOIN pat_medication b ON a.id = b.pat_id
WHERE a.status != 2
AND b.status != 2
AND b.directions = '$medication'
AND b.last_med_time < '$start_date'
AND '$full_dt' BETWEEN b.start_date AND b.end_date
AND a.location_code IN($inQuery)
UNION ALL SELECT COUNT(d.id) AS counts
FROM pat_info c
INNER JOIN prn_medication d ON c.id = d.pat_id
WHERE c.status != 2
AND d.status != 2
AND d.dose_frequency = '$medication'
AND d.last_med_time < '$start_date'
AND '$full_dt' BETWEEN d.start_date AND d.end_date
AND c.location_code IN($inQuery) ) x ";
$statement = $conn->prepare($query);
$codeArray = array_merge($codeArray,$codeArray);
$statement->execute($codeArray);
有print_r($inQuery);
个结果?,??,?
使用print_r($codeArray);
在array_merge($codeArray,$codeArray);
之前
结果Array ( [0] => 1 [1] => 2 ) Array ( [0] => 1 [1] => 2 [2] => 1 [3] => 2 )
使用print_r($codeArray);
在array_merge($codeArray,$codeArray);
结果Array ( [0] => 1 [1] => 2 [2] => 1 [3] => 2 ) Array ( [0] => 1 [1] => 2 [2] => 1 [3] => 2 [4] => 1 [5] => 2 [6] => 1 [7] => 2 )
解决方法
我认为在这种情况下,最好将bindParam
与命名参数一起使用,例如:
$code = '1,2,3,4';
$full_dt = date('Y-m-d H:i:s');
$start_date = "2020-08-28 14-44-23";
$medication = "OD";
$query = "SELECT SUM(counts) AS allcounts FROM
(SELECT COUNT(b.id) AS counts
FROM pat_info a
INNER JOIN pat_medication b ON a.id = b.pat_id
WHERE a.status != 2
AND b.status != 2
AND b.directions = :medication
AND b.last_med_time < :start_date
AND :full_dt BETWEEN b.start_date AND b.end_date
AND FIND_IN_SET(a.location_code,:code)>0
UNION ALL SELECT COUNT(d.id) AS counts
FROM pat_info c
INNER JOIN prn_medication d ON c.id = d.pat_id
WHERE c.status != 2
AND d.status != 2
AND d.dose_frequency = :medication
AND d.last_med_time < :start_date
AND :full_dt BETWEEN d.start_date AND d.end_date
AND FIND_IN_SET(c.location_code,:code)>0 ) x ;";
$statement = $conn->prepare($query);
$statement->bindParam(':code',$code,PDO::PARAM_STR);
$statement->bindParam(':full_dt',$full_dt,PDO::PARAM_STR);
$statement->bindParam(':start_date',$start_date,PDO::PARAM_STR);
$statement->bindParam(':medication',$medication,PDO::PARAM_STR);
$statement->execute();
,
问题应该是数字“?”与您传递的参数数量不匹配。
此处在“ $ statement-> execute($ codeArray)”中,$ codearray的元素数应与逗号分隔的“?”数相同。在$ inQuery中。 与“ With print_r($ inQuery); result?,??,?”共享的内容看起来很有趣,不是逗号分隔的问号序列吗?
,绑定所有参数
看看$full_dt = date('Y-m-d H:i:s');
让我们回显查询,并仔细看一下这一部分:
...
...
AND '2020-09-16 18:57:31' BETWEEN d.start_date AND d.end_date
...
...
然后我们转到文档:https://www.php.net/manual/en/pdostatement.bindparam.php#refsect1-pdostatement.bindparam-parameters
参数标识符。对于使用命名占位符的准备好的语句,这将是格式为
:name
的参数名。对于使用问号占位符的准备好的语句,这将是参数的1索引位置。
您能否看到来自:57
的{{1}}和:31
的两个不请自来的来宾:i
和:s
?
预计它们也将绑定到某些数据。
, INNER JOIN在每个表中都有数据时返回结果。这意味着返回行将是在每个表上至少共享一个a.id
,b.pat_id
和c.pat_id
的条目。
也许您对LEFT JOIN更加感兴趣,这将返回所有扩展了pat_info
和pat_medication
的{{1}}条目,无论您在其中有数据还是没有数据表。
https://dev.mysql.com/doc/refman/5.7/en/join.html
,选择* 从 表A 内部联接 表B b 在a.common = b.common 内部联接 表C c 在b.common = c.common
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。