好 啊。。所以我在这里发了个帖子:
mysql/php/pdo+如何为in()类中的每个(重复)条目获取一行?
显然地。。。没有解决办法(或者我被告知。。
那么,使用in()子句还有其他解决方案吗?一个实际上为传入的每个项返回一行的函数…不管它是否是重复的条目?
我有关于使用(自)连接的建议。。甚至可能存在。。。但我不清楚如何使用这些建议来调整当前的动态查询?
$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
是否可以将其更改为使用联接或exists(任何内容),以便为每个项返回一行(哪个是动态发布的数组?)
1条答案
按热度按时间7y4bm7vi1#
它并不完全漂亮,但您可以将列表“转换”为子查询,并将其与要查询的实际表连接起来。
我猜可能有一些php方法可以用来分解/拆分用于填充in列表以创建
SELECT ... UNION ALL ...
子查询。最糟糕、最原始的情况(在伪代码中),假设一个简单的逗号分隔列表:
theList = "SELECT " + REPLACE(theList, ',', ' AS item UNION ALL SELECT')
如果查询长度成为一个问题,另一个选项是创建一个临时表来存储in列表,然后根据该表进行连接(这种技术有时也可以用来加快查询速度;因为可以对temp表进行索引以帮助执行联接操作。)