返回的查询顺序不正确

w9apscun  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(465)

表格布局示例:http://rextester.com/qsdqa17146
我不是100%肯定。。但我相信这个错误是由于查询方面的原因。。。。
背景:我有一个查询..我将数组传递给它,用于根据表中数组中的值/字段检索数据。
我最初使用的是in()子句。。但因为我的数组可以/确实有重复项(即:1、2、3、4、2、3、6、7)。。我需要为in()子句中的每个值返回一行(即使表中只有一行)。。
在这里得到一些帮助后..我被告知要将此更新为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 calls。

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)

我试着输出一些调试代码并跟踪数组顺序的变化。。它似乎在查询返回部分?
以下是传递到上述函数中的数组(已解析):

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

hgqdbh6s1#

没有一个 ORDER BY a条款 SELECT ,mysql可以按其选择的任何顺序自由返回行。这种行为符合标准。
如果需要按特定顺序返回行,则提供 ORDER BY 在最外面 SELECT .
例如,我们可以列出 seq 列作为 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的行。除了行的顺序之外,规范不清楚查询的预期返回是什么。)

相关问题