mysql+替代in()子句,该子句为每个项返回行?

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

好 啊。。所以我在这里发了个帖子:
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(任何内容),以便为每个项返回一行(哪个是动态发布的数组?)

7y4bm7vi

7y4bm7vi1#

它并不完全漂亮,但您可以将列表“转换”为子查询,并将其与要查询的实际表连接起来。

SELECT t.stuff
FROM (SELECT 'in item 1' AS item 
      UNION ALL SELECT 'in item 2' 
      UNION ALL ...
) AS inList
INNER JOIN $tablename AS t ON inList.item = CONCAT(t.brandname, ' ', t.dosage)
ORDER BY ...

我猜可能有一些php方法可以用来分解/拆分用于填充in列表以创建 SELECT ... UNION ALL ... 子查询。
最糟糕、最原始的情况(在伪代码中),假设一个简单的逗号分隔列表: theList = "SELECT " + REPLACE(theList, ',', ' AS item UNION ALL SELECT') 如果查询长度成为一个问题,另一个选项是创建一个临时表来存储in列表,然后根据该表进行连接(这种技术有时也可以用来加快查询速度;因为可以对temp表进行索引以帮助执行联接操作。)

相关问题