将 ORDER BY 添加到 LEFT OUTER JOIN

Posted

技术标签:

【中文标题】将 ORDER BY 添加到 LEFT OUTER JOIN【英文标题】:Adding ORDER BY to LEFT OUTER JOIN 【发布时间】:2020-01-07 13:38:28 【问题描述】:

我的图片有问题。在$t_adpics 表中有一个picid AUTO_INCREMENT 列。我想使用picid ids 按从低到高的顺序显示图像。

SELECT a.*, p.picid
FROM $t_ads a
LEFT OUTER JOIN $t_adpics p ON a.adid = p.adid
WHERE a.adid > 0
GROUP BY a.adid
ORDER BY a.adid DESC, p.picid ASC

所以,我在 SELECT 部分添加了p.picid,然后在 ORDER BY 中添加了p.picid ASC,但图像仍然以任何顺序显示。

【问题讨论】:

好吧,如果您不希望它们按第一列排序,则必须删除第一列...如果您已经订购第二列,则添加第二列作为辅助订单将无济于事独特的价值。 '向我们展示一些示例结果、当前订单和想要的订单。 您好,您知道结果将首先按 a.adid DESC 排序,然后按 p.picid ASC 排序吗? 请注意,在没有任何聚合函数的情况下,GROUP BY 子句永远不合适。如需更多帮助,请参阅:Why should I provide an MCRE for what seems to me to be a very simple SQL query? 【参考方案1】:

简而言之,将 p.picid 放在 ORDER BY 子句的第一位,或者不理会它。

TLDR; 如果您想按“右侧”的图片对列表进行排序,我怀疑 LEFT OUTER JOIN 在这里是否适用。我想 INNER JOIN 会更适合这里。 此外,GROUP BY 与SELECT * 一起看起来很奇怪。您只能在此处使用分组字段或聚合。

【讨论】:

【参考方案2】:

我假设adida 表的主键(或至少是唯一的)。

您需要一个聚合,可能是min()group_concat()

SELECT a.*, MIN(p.picid) as picid
FROM $t_ads a LEFT OUTER JOIN
     $t_adpics p
     ON a.adid = p.adid
WHERE a.adid > 0
GROUP BY a.adid
ORDER BY a.adid DESC, p.picid ASC;

首先,SELECT 中的picid 有问题——它不是聚合的一部分。这是一个错误。

ORDER BYGROUP BY 之后被解析。所以这个栏目不可用。

但是,使用聚合函数定义它可以解决这个问题。

【讨论】:

这个查询在 a 的非聚合列上返回一个不确定的结果似乎是合理的(很可能,甚至)。 @Strawberry 。 . .我明确假设 id 是唯一的或主键。 这似乎是一个不太可能的假设。 @Strawberry 。 . .一点也不。首先,它与原始语法一致。其次,在一个名为t_ads的表中,将主键命名为adid是相当合理的。 主键很少为 0 或小于 0

以上是关于将 ORDER BY 添加到 LEFT OUTER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

无法将 ORDER BY 命令添加到存储过程

将 JOIN 和 ORDER BY 添加到查询后,性能意外提升

将非 FK 条件添加到 Django ORM 中的 LEFT OUTER JOIN 以返回不连接的行

使用方法语法实现的 LEFT OUTER JOIN

将 ORDER BY 语句添加到查询而不展平结果会导致“无法查询重复字段的叉积”

使用 LEFT JOIN + ORDER BY 时如何避免 FileSort?