返回不同的列,按重复次数排序

时间:2012-10-28 21:39:34

标签: sql join count sql-order-by

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

  1. 包含属性ID
  2. 的OrderType
  3. RestaurantVisit,包含媒体资源OrderTypeIDRestaurantID
  4. 餐厅,有财产ID
  5. 当给出订单类型(例如Drink,Side,Entree)时,我需要返回之前已订购该订单类型的所有餐厅,按哪个餐厅的最多订单排序类型。

    例如,在给定类型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 = ?)

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

2 个答案:

答案 0 :(得分:1)

您需要添加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,它将返回此查询中的所有Restaurants和orderTypes。

答案 1 :(得分: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。 (内部)联接将确保餐厅之前已订购该类型。