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 中的睾丸。
我有两个 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 中的睾丸。