语言:php
数据库:mysql
我的理解是,如果in()子句中有重复项。。他们将被跳过。。。对于in()子句中的每一项,我都需要一个return/行。。不管他们是不是笨蛋。
从阅读。。。我相信[self]join()是我正在寻找的方法/解决方案。。但我不清楚如何在同一个表上进行这种连接。。尤其是下面我已经提出的问题(我需要它的时候它就起作用了。。对于in()子句中的重复项,不返回行的情况除外)
然而。。我也读过关于exists()的文章。。也许是更好的方法(我不是在追求速度。。我正在寻找一个有效的解决方案)
我有一个rextexter示例,用于显示同一个表(但是,这个查询在rextester上有效,但在现实世界或wamp…等中无效)
http://rextester.com/szrian96972
所以我不清楚它是否真的是查询本身(我读到的是这个问题,因为在in()子句中会跳过dup)。。。因为它在wamp和rextester中“起作用”。。。
所以也许它是pdo行动的一部分?将数组传递给execute()函数时可能发生了什么?
pdo代码段:
$qMarks = str_repeat('?,', count($brandlist) - 1) . '?'; //create '?' mark placeholders for query, remove last comma and replace with '?'
//preserve IN() order
$displayList_sql = "SELECT * FROM $tablename WHERE CONCAT(brandname, ' ', dosage) IN ($qMarks) ORDER BY FIELD(CONCAT(brandname, ' ', dosage),'". trim(implode("','", $brandlist))."')";
$displayList_stmt = $conn->prepare($displayList_sql);
$displayList_stmt->execute($brandlist);//make note of passing in array as param to execute() call
传入的$brandlist数组示例:(带DUP)
Zyflo CR Extended-release tablet 600 mg','Zyflo CR Extended-release tablet 600 mg',' SEE NOTES BELOW'
所以在这一点上。。我不清楚in()子句是否是问题所在?或者在将数组传递给execute()命令时正在执行某些操作?在in()子句中有什么内容正在剥离/跳过重复项?我怎样才能避免呢?我希望这是一种自我结合。。但我看到的所有示例都有硬编码的值(不能是)…然后位于initial in()子句中的重复条目被用于第二个查询或其他什么(我完全跟随,因为我看不出这是如何适用于我的情况)
下面是一个工作示例的快速转储,我已经在本地wamp安装上运行了这个示例:(需要您自己的连接包含文件)
require_once('../db_wamp_pdo.php');
$tablename = 'xxx';
//hard coded list for testing
$brandList_og = array('Zyflo CR Extended-release tablet 600 mg','Zyflo CR Extended-release tablet 600 mg',' SEE NOTES BELOW', 'Alvesco HFA 80mcg');
function get_displayList($tablename, $conn, $brandlist){
$rowcount = 0;
if($brandlist != '' && count($brandlist) > 0){
$qMarks = str_repeat('?,', count($brandlist) - 1) . '?'; //create '?' mark placeholders for query, remove last comma and replace with '?'
//$displayList_sql = "SELECT * FROM $tablename WHERE CONCAT(brandname, ' ', dosage) IN('Zyflo CR Extended-release tablet 600 mg','Zyflo CR Extended-release tablet 600 mg',' SEE NOTES BELOW', 'Alvesco HFA 80mcg') ORDER BY FIELD(CONCAT(brandname, ' ', dosage),'Zyflo CR Extended-release tablet 600 mg','Zyflo CR Extended-release tablet 600 mg',' SEE NOTES BELOW', 'Alvesco HFA 80mcg')";
$displayList_sql = "SELECT * FROM $tablename WHERE CONCAT(brandname, ' ', dosage) IN($qMarks) ORDER BY FIELD(CONCAT(brandname, ' ', dosage),'". trim(implode("','", $brandlist))."')";
//$displayList_sql = "SELECT * FROM $tablename WHERE CONCAT(brandname, ' ', dosage) FIND_IN_SET($qMarks) ORDER BY FIELD(CONCAT(brandname, ' ', dosage),'". trim(implode("','", $brandlist))."')";
//$displayList_sql = "SELECT * FROM $tablename WHERE EXISTS(SELECT CONCAT(brandname, ' ', dosage)) ORDER BY FIELD(CONCAT(brandname, ' ', dosage),'". trim(implode("','", $brandlist))."')";
$displayList_stmt = $conn->prepare($displayList_sql);
$displayList_stmt->execute($brandlist);//make note of passing in array as param to execute() call
$displayList_stmt->setFetchMode(PDO::FETCH_ASSOC);
$_displayList = $displayList_stmt->fetchAll(); //returns multi-dimensional array (and correct count)
$colcount = $displayList_stmt->columnCount();
$rowcount = $displayList_stmt->rowCount();
}
if($rowcount <= 0){
//nothing returned
}else{
return $_displayList;
}
}
$my_displayList = get_displayList($tablename, $conn, array_values(array_filter($brandList_og)));//array_filter() added to get count of only non empty indexes
echo 'BRAND LIST: <br>';
echo var_dump($my_displayList);
echo '<br>';
我一直在输出调试文本。。“数组”在从查询返回之前是正常的。。
所以要么是in()子句(我目前的理论),我需要帮助在这个动态查询中添加一个self-join?或者(不太可信)将数组传递到execute()行。。正在解析/删除内容?
1条答案
按热度按时间t40tm48m1#
中的重复
in()
从句在你使用这个词的意义上并没有被真正跳过。复制字段确实被跳过了,但这并不重要,因为IN()
语句评估为OR
声明。例如:
计算结果为
如果我们再加一个
'a'
为了这个IN()
语句,它会被“忽略”,因为'a'
值已与第一个匹配。让优化器再次写出来是没有意义的。