使用子选择和分组进行排序
Order by using subselect and grouping
这是一个Fiddle:SQLFIDDLE
如果你查看我的子查询 select location ids and order them by the sort column
。 我希望我的最终结果集按照我在子查询中选择的 locids 的排列进行排序。 因此,例如,它应该有位置 3166 的评论,然后是位置 269,然后是位置 3572 INSTEAD of it's current results
.
最后,我想限制每个位置只有一个评论(这意味着我想根据评论创建日期订购)这就是我使用 locid 分组的原因。
因此,对于最终的结果集,我应该得到(按此顺序):
查看第 16 行
查看第 19 行
查看第 24 行
此结果集满足以下要求(按顺序):
在位置 table
中按排序标志排序
检索到基于排序位置的最新评论
感谢您的帮助。如果您需要任何进一步的信息,请随时询问。
更新
我需要的是按位置排序列排序的评论列表,然后是评论创建日期,每个位置限制为 1 个。 如果您可以通过其他方式解决此问题,请告诉我。谢谢
第二次更新
我已经开始尝试使用内部联接,但我无法显示具有最大创建日期的记录。 SQLFIDDLE TWO
select *
在使用 group by
时完全不合适。聚合查询应该有聚合函数。
您问题的一般答案是使用 join
。此类查询的示例如下所示:
select r.locid, count(*), max(r.createdate)
from reviews r join
locations l
on r.locid = l.locid
group by locid
order by sort;
!编辑:在弄清楚排序列的用途之后......
这应该是您要查找的内容:sqlfiddle.com/#!9/fa15b/9
SELECT r.reviewid, r.locid, r.title, r.createdate, l.sort
FROM reviews r
INNER JOIN locations l ON l.locid = r.locid
WHERE r.reviewid IN
(SELECT MAX(r2.reviewid) FROM reviews r2
GROUP BY r2.locid)
ORDER BY l.sort
说明;我将尝试尽可能彻底地解释这一点,以便其他人遇到此问题时,它是有道理的。
让我们从这个查询中 "need" 的内容开始:
- 所有有评论的地点
- 对于要按 "sort" 排序的项目,来自位置 table
- 每个地点的最高(即最新)评论(来自评论 table)
我们一次解决一个问题:
加入有评论的地点就像听起来一样简单。我们 运行 在键 "locid" 上的评论和位置之间进行了 SQL JOIN,为我们提供了仅具有评论的位置的结果集(反之亦然)
下一个最简单的操作是按 "sort" 列排序。因此 "ORDER BY l.sort"。这给我们留下了所有 reviews/locations 映射的完整列表。
最后一项是只为每个地点挑选最近的评论。由于reviewid是按升序排列的,所以选择日期和review id的结果是一样的,reviewid对我来说更容易。
- 这是子查询的用武之地;我只想获取每个位置的最新 reviewid 列表(阅读:具有最高值的主键)。
- 我 select MAX(r2.reviewid) 使用与评论不同的别名,以便我可以将它与原始列表 (r1) 进行比较。请注意,如果我在此处保留 MAX() 而不进行分组,我将只能获得所有评论中最高的评论 ID(6,我认为在示例中?)
- 接近完成,我们按 r2.locid 对子查询进行分组,以便 return,对于每个单独的 locid,编号最高的 reviewid。
- 这个难题的最后一部分是从子查询中引用 reviewid,以便我们只获得我们想要的最大 id;然后在 SELECT 语句中输入您想要的任何列。
补充说明:
- 我们不想要没有评论的地点
- 我们不想要任何位置的倍数
- 我也可以做一个自连接,使用相同的逻辑而不是子查询,但我认为 WHERE 子句更容易理解。
- 如果您出于某种原因想要包含没有任何评论的位置,则需要使用一些奇怪的 RIGHT JOIN 逻辑。
- 您应该将前两项作为练习来实现。
这是一个Fiddle:SQLFIDDLE
如果你查看我的子查询 select location ids and order them by the sort column
。 我希望我的最终结果集按照我在子查询中选择的 locids 的排列进行排序。 因此,例如,它应该有位置 3166 的评论,然后是位置 269,然后是位置 3572 INSTEAD of it's current results
.
最后,我想限制每个位置只有一个评论(这意味着我想根据评论创建日期订购)这就是我使用 locid 分组的原因。
因此,对于最终的结果集,我应该得到(按此顺序):
查看第 16 行
查看第 19 行
查看第 24 行
此结果集满足以下要求(按顺序):
在位置 table
中按排序标志排序
检索到基于排序位置的最新评论
感谢您的帮助。如果您需要任何进一步的信息,请随时询问。
更新
我需要的是按位置排序列排序的评论列表,然后是评论创建日期,每个位置限制为 1 个。 如果您可以通过其他方式解决此问题,请告诉我。谢谢
第二次更新
我已经开始尝试使用内部联接,但我无法显示具有最大创建日期的记录。 SQLFIDDLE TWO
select *
在使用 group by
时完全不合适。聚合查询应该有聚合函数。
您问题的一般答案是使用 join
。此类查询的示例如下所示:
select r.locid, count(*), max(r.createdate)
from reviews r join
locations l
on r.locid = l.locid
group by locid
order by sort;
!编辑:在弄清楚排序列的用途之后...... 这应该是您要查找的内容:sqlfiddle.com/#!9/fa15b/9
SELECT r.reviewid, r.locid, r.title, r.createdate, l.sort
FROM reviews r
INNER JOIN locations l ON l.locid = r.locid
WHERE r.reviewid IN
(SELECT MAX(r2.reviewid) FROM reviews r2
GROUP BY r2.locid)
ORDER BY l.sort
说明;我将尝试尽可能彻底地解释这一点,以便其他人遇到此问题时,它是有道理的。
让我们从这个查询中 "need" 的内容开始:
- 所有有评论的地点
- 对于要按 "sort" 排序的项目,来自位置 table
- 每个地点的最高(即最新)评论(来自评论 table)
我们一次解决一个问题:
加入有评论的地点就像听起来一样简单。我们 运行 在键 "locid" 上的评论和位置之间进行了 SQL JOIN,为我们提供了仅具有评论的位置的结果集(反之亦然)
下一个最简单的操作是按 "sort" 列排序。因此 "ORDER BY l.sort"。这给我们留下了所有 reviews/locations 映射的完整列表。
最后一项是只为每个地点挑选最近的评论。由于reviewid是按升序排列的,所以选择日期和review id的结果是一样的,reviewid对我来说更容易。
- 这是子查询的用武之地;我只想获取每个位置的最新 reviewid 列表(阅读:具有最高值的主键)。
- 我 select MAX(r2.reviewid) 使用与评论不同的别名,以便我可以将它与原始列表 (r1) 进行比较。请注意,如果我在此处保留 MAX() 而不进行分组,我将只能获得所有评论中最高的评论 ID(6,我认为在示例中?)
- 接近完成,我们按 r2.locid 对子查询进行分组,以便 return,对于每个单独的 locid,编号最高的 reviewid。
- 这个难题的最后一部分是从子查询中引用 reviewid,以便我们只获得我们想要的最大 id;然后在 SELECT 语句中输入您想要的任何列。
补充说明:
- 我们不想要没有评论的地点
- 我们不想要任何位置的倍数
- 我也可以做一个自连接,使用相同的逻辑而不是子查询,但我认为 WHERE 子句更容易理解。
- 如果您出于某种原因想要包含没有任何评论的位置,则需要使用一些奇怪的 RIGHT JOIN 逻辑。
- 您应该将前两项作为练习来实现。