使用子选择和分组进行排序

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 分组的原因。

因此,对于最终的结果集,我应该得到(按此顺序):

此结果集满足以下要求(按顺序):

感谢您的帮助。如果您需要任何进一步的信息,请随时询问。

更新

我需要的是按位置排序列排序的评论列表,然后是评论创建日期,每个位置限制为 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)

我们一次解决一个问题:

  1. 加入有评论的地点就像听起来一样简单。我们 运行 在键 "locid" 上的评论和位置之间进行了 SQL JOIN,为我们提供了仅具有评论的位置的结果集(反之亦然)

  2. 下一个最简单的操作是按 "sort" 列排序。因此 "ORDER BY l.sort"。这给我们留下了所有 reviews/locations 映射的完整列表。

  3. 最后一项是只为每个地点挑选最近的评论。由于reviewid是按升序排列的,所以选择日期和review id的结果是一样的,reviewid对我来说更容易。

    • 这是子查询的用武之地;我只想获取每个位置的最新 reviewid 列表(阅读:具有最高值的主键)。
    • 我 select MAX(r2.reviewid) 使用与评论不同的别名,以便我可以将它与原始列表 (r1) 进行比较。请注意,如果我在此处保留 MAX() 而不进行分组,我将只能获得所有评论中最高的评论 ID(6,我认为在示例中?)
    • 接近完成,我们按 r2.locid 对子查询进行分组,以便 return,对于每个单独的 locid,编号最高的 reviewid。
  4. 这个难题的最后一部分是从子查询中引用 reviewid,以便我们只获得我们想要的最大 id;然后在 SELECT 语句中输入您想要的任何列。

补充说明:

  • 我们不想要没有评论的地点
  • 我们不想要任何位置的倍数
  • 我也可以做一个自连接,使用相同的逻辑而不是子查询,但我认为 WHERE 子句更容易理解。
  • 如果您出于某种原因想要包含没有任何评论的位置,则需要使用一些奇怪的 RIGHT JOIN 逻辑。
  • 您应该将前两项作为练习来实现。