mysql/php/pdo+如何为in()类中的每个(重复)条目获取一行?

vddsk6oq  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(301)

语言: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()行。。正在解析/删除内容?

t40tm48m

t40tm48m1#

中的重复 in() 从句在你使用这个词的意义上并没有被真正跳过。复制字段确实被跳过了,但这并不重要,因为 IN() 语句评估为 OR 声明。
例如:

select * from table
where table.thing in ('a', 'b')

计算结果为

select * from table
where 
   table.thing    = 'a'
   or table.thing = 'b'

如果我们再加一个 'a' 为了这个 IN() 语句,它会被“忽略”,因为 'a' 值已与第一个匹配。让优化器再次写出来是没有意义的。

相关问题