【问题标题】:Return distinct columns, ordered by count of duplicates返回不同的列,按重复数排序
【发布时间】:2012-10-28 21:39:33
【问题描述】:

这是我的三个相关的 sql 表及其相关属性:

  1. OrderType 属性ID
  2. RestaurantVisit,属性为OrderTypeIDRestaurantID
  3. 餐厅,物业ID

当给定一个订单类型(例如饮料、配菜、主菜)时,我需要返回之前订购过该订单类型的所有餐厅,以及哪个餐厅的订单最多输入。

例如,给定类型side,我返回餐厅r1, r2, r3,其中r1 是所有餐厅中最多 订单side 的餐厅,r2 是排名第二的,以此类推。

这是我目前所拥有的(记住,我已经获得了一个 OrderTypeID):

SELECT DISTINCT r.ID
FROM Restaurant r
  JOIN RestaurantVisit rv
    ON rv.OrderTypeID = ?
WHERE rv.ID = r.ID

这目前可以返回所有曾经收到给定类型订单的餐厅。我现在需要做的是按给定类型订单最多的餐厅订购这些。

我的想法是在某处添加这样的东西,但我完全不确定:

ORDER BY COUNT(rv.OrderTypeID = ?)

有人有什么想法吗?谢谢!

【问题讨论】:

    标签: sql join count sql-order-by


    【解决方案1】:
      SELECT R.ID, R.Name, Count(V.OrderTypeID) NumVisits
        FROM OrderType T
        JOIN RestaurantVisit V on V.OrderTypeID = T.ID
        JOIN Restaurant R on R.ID = V.RestaurantID
       WHERE T.name = 'side'
    GROUP BY R.ID, R.Name
    ORDER BY NumVisits DESC;
    

    ORDER BY 的 ANSI/ISO 标准是使用 column alias。 (INNER) JOIN 将确保该类型之前已由 Restaurant 订购。

    【讨论】:

      【解决方案2】:

      您需要添加一个GROUP BY

      SELECT r.ID, rv.OrderTypeId
         , COUNT(1) AS CountOfOrdersAtRestaurant
      FROM Restaurant AS r
      INNER JOIN RestaurantVisit AS rv ON r.RestaurantId = rv.RestaurantId
      GROUP BY r.ID, tv.OrderTypeID
      ORDER BY COUNT(1) DESC
      

      这将按餐厅和 orderType 对结果进行分组。然后您可以添加ORDER BY 以按您想要的顺序显示结果。

      如果您不向其中添加WHERE,它将返回此查询中的所有餐厅和订单类型。

      【讨论】:

      • 谢谢:-)。我投票给另一个人,因为这对我来说更有意义。
      • @AndyJoslin 不客气。很高兴您找到了适合您的答案。
      猜你喜欢
      • 1970-01-01
      • 2016-09-05
      • 2015-04-25
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 2012-03-16
      相关资源
      最近更新 更多