Mysql内部join-如何使用join子句中第一个表列的值

Mysql内部join-如何使用join子句中第一个表列的值,mysql,Mysql,在我的预订表中,每个预订都有若干人和一个活动时间,这是可预订的三个时段之一 在我的查询中,我试图返回每个餐厅还有多少免费座位,以及时间段事件\时间编号 我选择餐馆并进行内部联接以包括bookings表,但我需要从内部联接中的餐馆表访问number_of_seats_max列,这似乎是不可能的 这是 表: CREATE TABLE `restaurants` ( `id` int(10) UNSIGNED NOT NULL, `title` text COLLATE utf8mb4_uni

在我的预订表中,每个预订都有若干人和一个活动时间,这是可预订的三个时段之一

在我的查询中,我试图返回每个餐厅还有多少免费座位,以及时间段事件\时间编号

我选择餐馆并进行内部联接以包括bookings表,但我需要从内部联接中的餐馆表访问number_of_seats_max列,这似乎是不可能的

这是

表:

CREATE TABLE `restaurants` (
  `id` int(10) UNSIGNED NOT NULL,
  `title` text COLLATE utf8mb4_unicode_ci,
  `number_of_seats_max` int(11) DEFAULT NULL
);

CREATE TABLE `bookings` (
  `id` int(10) UNSIGNED NOT NULL,
  `event_date` timestamp NULL DEFAULT NULL,
  `event_time` int(11) NOT NULL,
  `number_of_persons` int(11) NOT NULL,
  `restaurant_id` int(11) NOT NULL
);
下面的查询可以工作,但在本例中,我硬编码了80,而不是max seats列r.number\u of_seats\u max。这就是我需要使用的专栏。如果将r.number\u of\u seats\u max改为,则会得到错误未知列


我怎样才能解决它

在主查询中执行减法运算,而不是在子查询中执行减法运算

SELECT r.title, innerquery.event_time, r.number_of_seats_max, 
        r.number_of_seats_max - innerquery.num_persons_booked AS free_seats_left,
        innerquery.num_persons_booked
FROM restaurants r
INNER JOIN(
    select 
        restaurant_id,
        event_time,
        SUM(number_of_persons) as num_persons_booked
    from bookings
    WHERE event_date = '2019-07-18'
    group by event_time,restaurant_id
) as innerquery
     ON innerquery.restaurant_id = r.id
ORDER BY free_seats_left DESC

我在子查询和主查询的选择列表中都添加了事件时间,因此您可以显示每个时间段的可用座位。

order by需要重新定位到外部查询。在内联视图查询中将事件\时间包含在group by中时,我感到困惑。因为这不会返回到外部查询,可能会有多个匹配行,所以我们无法区分哪一行是哪个事件的行_time@spencer7593接得好,我没有看剩下的部分,只是专注于计算。我在两个查询的结果中都添加了event_time,因为他说他想知道每次有多少座位可用。从内联视图查询内部引用外部查询中的表是不可能的。MySQL处理内联视图查询,即选择。。。下面先加入。MySQL将内联视图称为派生表。当我们了解它是如何处理的时候,这是有道理的。一旦内联视图查询被具体化为一个表,就可以执行外部查询,从派生表中获取行,就像它是一个常规表一样。内联视图查询在访问餐厅中的任何行之前执行一次。看看巴尔马的答案。
SELECT r.title, innerquery.event_time, r.number_of_seats_max, 
        r.number_of_seats_max - innerquery.num_persons_booked AS free_seats_left,
        innerquery.num_persons_booked
FROM restaurants r
INNER JOIN(
    select 
        restaurant_id,
        event_time,
        SUM(number_of_persons) as num_persons_booked
    from bookings
    WHERE event_date = '2019-07-18'
    group by event_time,restaurant_id
) as innerquery
     ON innerquery.restaurant_id = r.id
ORDER BY free_seats_left DESC