【问题标题】:Group By multiple Entries按多个条目分组
【发布时间】:2022-02-05 23:31:08
【问题描述】:

数据库有几个表:

  • 旅游
  • 预订
  • 指南

现在每个旅游都可以有 n 个预订,每个导游可以有 n 个旅游。但是,在我的主页上,我只想显示一个包含 5 个旅行的列表,每个导游限制为 1 个旅行。但是,如果我从左加入预订,我需要按“tourId”分组,但另一方面,我还需要按“tourGuideId”分组,限制为 1。如果我 GROUP BY tourGuideId 它只向我显示每个导游的一个游览,但在 LEFT JOIN 时出现问题并显示预订,尽管没有。如果我 GROUP BY tourId 它适用于 LEFT JOIN,但不适用于每个指南 1 个的限制。

这是一个简单的查询:

SELECT f.*, SUM(b.bookingSeats) AS bookings
FROM tours AS f 
LEFT JOIN bookings AS b ON f.tourId = b.bookingTourId 
WHERE f.tourActive = '1'
GROUP BY f.tourGuideId
ORDER BY f.tourId DESC 
LIMIT 5

如何进行?

编辑 1:简单的“GROUP BY f.tourGuideId, f.tourId”不起作用。它使 LEFT JOIN 工作,但不限于每个指南 1 个结果。

编辑 2:示例结果应该是:

tourId, tourGuideId, tourTitle, tourDate, tourActive, bookings
5, 1, 'Hello World', '2016-12-01 08:00:00', 1, NULL
9, 3, 'Tour Paris', '2017-03-01 08:00:00', 1, 3

预订表结构:

bookingId, bookingStatus, bookingUserId, bookingDate, bookingPaid

游览表结构:

tourId, tourGuideId, tourTitle, tourDate, tourActive

【问题讨论】:

  • 您能否也发布一些示例输入数据以及预期的结果集?
  • 样本结果应该是 ...基于哪个输入?
  • @GiorgosBetsos 示例结果是我希望收到的。相反,使用 GROUP BY tourId,我可以得到几位导游的游览,而使用 GROUP BY tourGuideId,我每个导游只能得到一个导游,但左连接不起作用。
  • bookings 应该是该指南对所有旅行的预订总数,还是只是您为每个指南显示的 1 个旅行的预订数量?
  • 如果指南可以有 n 个游览,应该显示哪些游览?随便选一个?

标签: mysql sql


【解决方案1】:

从获取每个指南的最新导览的查询开始,如SQL Select only rows with Max Value on a Column 所示。

然后加入一个子查询,获取每个指南的总预订量。

SELECT f.*, bookings
FROM tours AS f
JOIN (SELECT MAX(tourId) AS maxTourId
      FROM tours
      GROUP BY tourGuideId) AS f1
ON f.tourId = f1.maxTourId
JOIN (
    SELECT tourGuideId, SUM(b.bookingSeats) AS bookings
    FROM tours AS f
    LEFT JOIN bookings AS b ON f.tourId = b.bookingsTourId
    GROUP BY tourGuideId) AS b
ON f.tourGuideId = b.tourGGuideId
ORDER BY tourId DESC
LIMIT 1

【讨论】:

  • 谢谢,不过这有点令人困惑 - 你从哪里获得“tourGroupId”?
  • 抱歉,tourGuideId 打错字了。
  • 你能用应该产生上述结果的示例输入数据制作一个 sqlfiddle 吗?
  • 抱歉,我使用的是COUNT 而不是SUM
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2018-05-19
  • 1970-01-01
  • 2012-12-12
相关资源
最近更新 更多