好的..所以我在这里发了一个帖子:
MySQL/PHP/PDO + How to get a row for each (duplicate) entry in IN() clasue?
显然......没有解决方案。 (或者我告诉过)..
那么是否有使用IN()子句的替代解决方案?实际上,对于传入的每个项目,它都会返回一行......无论是否重复输入?
我有关于使用(自)JOIN ......或者甚至可能是EXISTS的建议......但我不知道如何使用这些建议来调整当前的动态查询?
$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
是否可以将其更改为使用JOIN或EXISTS(任何内容),以便为每个项目返回一行? (这是一个动态发布的数组?)
答案 0 :(得分:0)
它不是很漂亮,但您可以将列表“转换”为子查询,并将其与您要查询的实际表格相连接。
$db->insert("adicionales_clientes", [
"categoria_adc" => 100,
"fecha_adc" => $importante->data2_tab3default,
"titulo_adc" => $importante->data1_tab3default,
"tipo_adc" => 3,
"cliente_adc" => $cliente,
]);
我的猜测是你可以使用一些php方法来爆炸/拆分你用来填充IN列表的变量来创建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 ...
子查询。
最糟糕,最原始的情况(伪代码),假设一个简单的逗号分隔列表:
SELECT ... UNION ALL ...
如果查询长度成为问题,另一个选项是创建临时表以存储IN列表,然后加入该表。 (此技术有时也可用于使查询更快;因为可以索引临时表以帮助进行连接操作。)