Пример таблицы: http://rextester.com/QSDQA17146
Я не уверен на 100%. Но я считаю, что ошибка связана с вопросом о вещах...
Предыстория: У меня есть запрос... что я передаю массив, который будет использоваться для извлечения данных на основе этого значения/поля в массиве из таблицы.
Первоначально я использовал предложение IN(), но из-за того, что у моего массива есть/есть дубликаты (то есть: 1, 2, 3, 4, 2, 3, 6, 7). Мне нужна строка, возвращаемая для каждого значения в предложение IN() (хотя в таблице всего 1 строка).
После получения некоторой помощи здесь. Мне сказали обновить это до запроса UNION ALL.. поэтому я мог бы получить строку, возвращаемую для каждого элемента в моем массиве (независимо от того, был ли он дубликат или нет)
SELECT * FROM tablex
WHERE CONCAT(brandname, ' ', dosage) IN (
'Zyflo CR Extended-release tablet 600 mg',
' SEE NOTES BELOW',
'Zyflo CR Extended-release tablet 600 mg'
) ORDER BY FIELD(
CONCAT(brandname, ' ', dosage),
'Zyflo CR Extended-release tablet 600 mg',
' SEE NOTES BELOW',
'Zyflo CR Extended-release tablet 600 mg'
);
Поэтому я обновил все, что мог, чтобы использовать вызовы PDO и UNION ALL.
SELECT t.* FROM (
SELECT 1 as seq,
'Zyflo CR Extended-release tablet 600 mg' as item
UNION ALL
SELECT 2, ' SEE NOTES BELOW '
UNION ALL
SELECT 3, 'Zyflo CR Extended-release tablet 600 mg'
) AS inList
INNER JOIN pbaap_drugs AS t ON inList.item = CONCAT(t.brandname, ' ', t.dosage);
Теперь я получаю строку, возвращаемую для каждого элемента. Однако возвращенные данные НЕ соответствуют первоначальному порядку массива, переданного в запрос.
Я вызываю функцию/запрос следующим образом:
$gn_displayList = get_displayList_alt($tablename, $conn, array_values(array_filter($_POST['gn_MedicineSelect'])));//array_filter() added to get count of only non empty indexes (no bloat)
Я попытался вывести некоторый код DEBUG и следовать где/где порядок массива меняется.. и кажется, что он находится в части возврата запроса?
Вот массив (разобранный), когда он передается в функцию выше:
FILTERED ARRAY CONTENTS: array(3) { [0]=> string(39) "Zyflo CR Extended-release tablet 600 mg" [1]=> string(17) " SEE NOTES BELOW " [2]=> string(39) "Zyflo CR Extended-release tablet 600 mg" }
В фактической функции запроса, где я динамически создаю структуру UNION ALL.. и т.д. Я снова проверяю массив (могу опубликовать это... но я не хочу уклоняться от сосредоточения на порядке вещей);)
array(3) { [0]=> string(39) "Zyflo CR Extended-release tablet 600 mg" [1]=> string(17) " SEE NOTES BELOW " [2]=> string(39) "Zyflo CR Extended-release tablet 600 mg" }
Все кажется хорошо.. правильный контент.. и правильный исходный порядок.
Однако... когда я получаю ответ/данные запроса... заказ не тот же. Кажется, что альфа разобрала его?
array(3) { [0]=> array(10) { ["id"]=> string(2) "74" ["lastupdated"]=> string(19) "0000-00-00 00:00:00" ["category"]=> string(24) "5-Lipoxygenase Inhibitor" ["brandname"]=> string(32) "Zyflo CR Extended-release tablet" ["genericname"]=> string(8) "zileuton" ["dosage"]=> string(6) "600 mg" ["image"]=> string(43) "Zyflo CR Extended-release tablet 600 mg.jpg" ["zone"]=> string(16) "green,yellow,red" ["menu"]=> string(1) "1" ["active"]=> string(1) "1" } [1]=> array(10) { ["id"]=> string(2) "74" ["lastupdated"]=> string(19) "0000-00-00 00:00:00" ["category"]=> string(24) "5-Lipoxygenase Inhibitor" ["brandname"]=> string(32) "Zyflo CR Extended-release tablet" ["genericname"]=> string(8) "zileuton" ["dosage"]=> string(6) "600 mg" ["image"]=> string(43) "Zyflo CR Extended-release tablet 600 mg.jpg" ["zone"]=> string(16) "green,yellow,red" ["menu"]=> string(1) "1" ["active"]=> string(1) "1" } [2]=> array(10) { ["id"]=> string(2) "78" ["lastupdated"]=> string(19) "0000-00-00 00:00:00" ["category"]=> string(0) "" ["brandname"]=> string(16) " SEE NOTES BELOW" ["genericname"]=> string(0) "" ["dosage"]=> string(0) "" ["image"]=> string(0) "" ["zone"]=> string(16) "green,yellow,red" ["menu"]=> string(1) "1" ["active"]=> string(1) "1" } }
Без предложения ORDER BY
в SELECT
MySQL может возвращать строки в любой последовательности, которую он выбирает. Это соответствует стандарту.
Если нам нужны строки, возвращаемые в определенном порядке, мы предоставляем ORDER BY
для внешнего SELECT
.
Например, мы можем перечислить seq
столбец в качестве первого слова в ORDER BY
, так что строки будут возвращены в seq
порядке. Мы можем добавить дополнительные выражения в ORDER BY, чтобы сделать порядок строк более детерминированным (т. inList
Когда имеется несколько строк из t
которые "соответствуют" строке из inList
)
SELECT t.id
, t.lastupdated
, t.category
, t.brandname
, t.genericname
, t.dosage
, t.image
, t.zone
, t.menu
, t.active
FROM ( SELECT 1 AS seq, 'Zyflo CR Extended-release tablet 600 mg' AS item
UNION ALL
SELECT 2, ' SEE NOTES BELOW '
UNION ALL
SELECT 3, 'Zyflo CR Extended-release tablet 600 mg'
) inList
JOIN pbaap_drugs t
ON CONCAT(t.brandname, ' ', t.dosage) = inList.item
ORDER
BY inList.seq
, t.brandname
, t.dosage
, ...
(Обратите внимание, что строки из t
которые соответствуют item
в строках с seq = 1 и seq = 3, не будут соответствовать строкам с seq = 2. В спецификации не ясно, какова ожидаемая отдача от запроса, кроме порядка строки.)