MySQL +替代IN()子句,为每个项返回行?

时间:2018-05-22 16:19:30

标签: php mysql pdo alternate

好的..所以我在这里发了一个帖子:

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(任何内容),以便为每个项目返回一行? (这是一个动态发布的数组?)

1 个答案:

答案 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列表,然后加入该表。 (此技术有时也可用于使查询更快;因为可以索引临时表以帮助进行连接操作。)