PHP, PDO и MySQL - неверный порядок запроса - PullRequest
0 голосов
/ 24 мая 2018

Пример макета таблицы: 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);

Теперь я получаю строку, возвращаемую для каждого элемента.. однако возвращаемые данные НЕ придерживаются первоначального порядка массива, переданного в запрос.

Я вызываю функцию / quвот так:

$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..etc .. Я проверяю массив снова (могуопубликуйте это ... но я не хочу отвлекать внимание от порядка вещей);)

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" } } 

1 Ответ

0 голосов
/ 24 мая 2018

Без предложения ORDER BY для SELECT MySQL может возвращать строки в любой последовательности, которую выберет.Это поведение соответствует стандарту.

Если нам нужны строки, возвращаемые в определенном порядке, мы предоставляем ORDER BY на самом внешнем SELECT.

Например, мы можем перечислить *Столбец 1009 * в качестве первого выражения в ORDER BY, поэтому строки будут возвращены в порядке seq.Мы можем добавить дополнительные выражения в ORDER BY, чтобы сделать порядок строк более детерминированным (т. Е. Когда есть несколько строк из 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. В спецификации не ясно, что ожидается от запроса, кроме ожидаемогопорядок строк.)

...