将 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】:我假设adid
是a
表的主键(或至少是唯一的)。
您需要一个聚合,可能是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 BY
在GROUP BY
之后被解析。所以这个栏目不可用。
但是,使用聚合函数定义它可以解决这个问题。
【讨论】:
这个查询在 a 的非聚合列上返回一个不确定的结果似乎是合理的(很可能,甚至)。 @Strawberry 。 . .我明确假设 id 是唯一的或主键。 这似乎是一个不太可能的假设。 @Strawberry 。 . .一点也不。首先,它与原始语法一致。其次,在一个名为t_ads
的表中,将主键命名为adid
是相当合理的。
主键很少为 0 或小于 0以上是关于将 ORDER BY 添加到 LEFT OUTER JOIN的主要内容,如果未能解决你的问题,请参考以下文章
将 JOIN 和 ORDER BY 添加到查询后,性能意外提升
将非 FK 条件添加到 Django ORM 中的 LEFT OUTER JOIN 以返回不连接的行