PHP, PDO и MySQL - неверный порядок запроса

0

Пример таблицы: 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" } } 
  • 0
    Я исправил свою опечатку в исходном вопросе и сказал вам сделать заказ по inList.seq; это не сработало?
Теги:
order
field
pdo
sql-order-by

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. В спецификации не ясно, какова ожидаемая отдача от запроса, кроме порядка строки.)

  • 0
    Спасибо за ответ. Переданный в массиве должен использоваться как «взгляд» для бренда + cols дозировки вместе. Он обнаружил, что должен вернуть все в этом ряду.
  • 0
    Извините, я думаю, что этого не было в оригинальном посте. Но на самом деле у меня действительно используется ORDER BY FIELD (): ORDER BY FIELD (CONCAT (фирменный знак, '', дозировка), 'Zyflo CR, расширенная версия таблетки 600 мг ',' СМОТРИТЕ НИЖЕ НИЖЕ НИЖЕ ',' Таблетка расширенного выпуска Zyflo CR 600 мг 'Часть, на которой я пропустил ..., почему она НЕ придерживается этого порядка на выходе? Это помещает zyflo, zyflo see details. В таком порядке вместо zyflo, смотрите подробности, порядок zyflo .. (тот же исходный порядок, что и у переданного массива)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню