ОК .. поэтому у меня был пост здесь:
MySQL / PHP / PDO + Как получить строку для каждой (повторяющейся) записи в IN ()?
Видимо … нет решения. (или мне так сказали) ..
Так есть ли альтернативное решение для использования предложения IN ()? Тот, который на самом деле возвращает строку для каждого элемента, переданного в … независимо от того, является ли это повторяющейся записью или нет?
У меня есть предложения по использованию (self) 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 (что угодно), чтобы он возвращал строку для каждого элемента? (который является динамически размещаемым массивом?)
Это не совсем красиво, но вы можете «преобразовать» свой список в подзапрос и объединить его с фактической таблицей, которую вы хотите запросить.
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, а затем присоединиться к ней. (Эту технику также иногда можно использовать для ускорения запроса; поскольку временная таблица может быть проиндексирована, чтобы помочь с операцией соединения.)
Других решений пока нет …