使用子选择和分组排序

时间:2016-03-02 18:20:45

标签: mysql sql subquery

这是一个小提琴:SQLFIDDLE

如果你查看我的子查询select location ids and order them by the sort column我想通过我在子查询中选择的我的locids的排列来排序我的最终结果集。因此,例如,它应该对位置3166,然后是位置269,然后位置3572 {{1 }}

最后,我想限制为每个位置一次审核(这意味着我想按创建的评论排序),这就是我使用locid组的原因。

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

  • 评论第16行

  • 评论第19行

  • 评论第24行

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

  • 按位置表

  • 中的排序标记排序
  • 根据分类的位置检索最新评论

感谢您的帮助。如果您需要任何进一步的信息,请不要犹豫。

更新

我需要的是按位置排序列排序的评论列表,然后是评论创建日期,每个位置的限制为1。 如果你能以另一种方式解决,请告诉我。感谢

第二次更新

我已经开始尝试使用内部联接,但我无法获得要显示的最佳创建记录。 SQLFIDDLE TWO

2 个答案:

答案 0 :(得分:0)

使用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;

答案 1 :(得分:0)

!编辑:清楚了解排序列的用途...... 这应该是您正在寻找的东西: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

解释;我将尝试尽可能彻底地解释这一点,以便如果有其​​他人遇到这个,那就有意义了。

让我们从我们需要的东西开始"来自这个查询:

  • 所有评论的地点
  • 用于按"排序",从位置表
  • 排序的项目
  • 每个位置的顶部(意味着最近的)评论(来自评论表)

我们一次只能解决一个问题:

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

  2. 下一个最简单的事情就是按照你的排序"排序"柱。因此," ORDER BY l.sort"。这给我们留下了所有评论/位置映射的完整列表。

  3. 最后一项是仅挑选每个位置的最新评论。由于reviewid是按升序排列的数字,因此选择日期与审核ID的结果相同,而且reviewid对我来说更容易。

    • 这是子查询的来源;我想获得每个位置的最新评论列表(读取:具有最高值的主键)。
    • 我使用评论中的其他别名选择MAX(r2.reviewid),以便我可以将其与原始列表(r1)进行比较。请注意,如果我在没有分组的情况下离开MAX(),我只会在所有评论中获得最高评价(6,我认为在示例中?)
    • 接近完成后,我们通过r2.locid对子查询进行分组,以便为​​每个单独的locid返回编号最高的reviewid。
  4. 这个难题的最后一部分是引用子查询中的reviewid,以便我们只获得我们想要的最大id;然后在SELECT语句中键入所需的列。
  5. 附加说明:

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