SQL 查询已预订的票数

SQL Query to count number of tickets reserved

我有两个 table:

Table 1:

id 
title

Table 2:

id 
Table_1_id
number_of_tickets

我需要一个查询来计算 table 2 的票数并显示:Table_1_id、标题、total_number_of_tickets

我写了这段代码,但它给我错误:

"column "plays.title" must appear in the GROUP BY clause or be used in an aggregate function
LINE 2: SELECT reservations.play_id AS id , plays.title , SUM(number..."
SELECT reservations.play_id AS id , plays.title , SUM(number_of_tickets) AS reserved_tickets FROM plays
INNER JOIN reservations
ON plays.id = reservations.play_id
GROUP BY play_id
ORDER BY SUM(number_of_tickets)

您可以加​​入两者,然后将查询分组:

SELECT   table_1_id, title, SUM(number_of_tickets)
FROM     table1 t1
JOIN     table2 t2 ON t1.id = t2.table_1_id
GROUP BY table_1_id, title

您可以使用子查询:

select t1.*,
    (select coalesce(sum(number_of_tickets), 0) from t2 where t2.table_1_id = t1.id) as number_of_tickets
from t1

有了 t2(table_1_id, number_of_tickets) 上的索引,这应该是一个有效的选择。


至于您的原始代码(作为对问题的编辑添加)。意图是好的,问题出在 GROUP BY 子句上,它与 SELECT 子句不一致。在 MySQL 中,你可以这样写:

SELECT p.id , p.title, SUM(r.number_of_tickets) AS reserved_tickets 
FROM plays p
INNER JOIN reservations r ON p.id = r.play_id
GROUP BY p.id
ORDER BY reserved_tickets

SELECT 子句中的所有非聚合列都来自 table plays,我们按 plays.id 分组,大概是 plays.id 的主键=31=].

请注意,我修改了查询以使用 table 别名:这是一个很好的做法,它使查询更易于编写和阅读。另请注意,ORDER BY 子句中允许使用列别名。

SELECT play_id, title, SUM(number_of_tickets) AS reserve 
FROM reservations r
JOIN plays p
ON p.id = r.play_id
GROUP BY play_id, title
ORDER BY 3

我最近遇到了这个:

plays_reservations=# select plays.id, title, sum(number_of_tickets) as reserved_tickets from plays inner join reservations on plays.id = reservations.play_id group by plays.id, plays.title order by reserved_tickets desc, id asc;
 id  |             title              | reserved_tickets 
-----+--------------------------------+------------------
 145 | Nameless.                      |              170
 109 | Queens and Kings of Madagascar |               46
 142 | Key of the tea                 |               46
 123 | Merlin                         |                3

PostgreSQL 14.2 中的睾丸。