gpt4 book ai didi

PHP、PDO 和 MySQL - 返回查询顺序不正确

转载 作者:行者123 更新时间:2023-11-29 10:13:33 25 4
gpt4 key购买 nike

表格布局示例: 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)

我尝试输出一些调试代码并跟踪数组顺序正在更改的位置..它似乎位于查询返回部分?

这是传递给上面的函数时的数组(已解析):

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

最佳答案

如果 SELECT 上没有 ORDER BY 子句,MySQL 可以自由地以其选择的任何顺序返回行。此行为符合标准。

如果我们需要以特定顺序返回行,我们会在最外面的 SELECT 上提供 ORDER BY

例如,我们可以将 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 中与 seq=1 和 seq=3 的行上的 item 匹配的行不会与 seq=2 的行匹配。规范是除了行的顺序之外,不清楚查询的预期返回结果。)

关于PHP、PDO 和 MySQL - 返回查询顺序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com