Reputation: 11
SELECT MIN(id),
MAX(id)
FROM (SELECT film_id,
COUNT(id) AS id
FROM screenings
GROUP BY film_id) a;
Upvotes: 1
Views: 596
Reputation: 93636
One thing to be careful of is that the naming in the subselect is confusing. You have COUNT(id) AS id
, but a better name for that count would be something like num_screenings
, because it's counting the number of screenings that the given film_id
appeared at.
Subselects can often be clearly written as a CTE (common table expression). This makes them easier to understand because they are in small self-contained segments.
So, if we combine these three changes:
screening_counts
instead of a
COUNT(id) AS id
to AS num_screenings
we get this that is much clearer:
WITH screening_counts AS (
SELECT film_id, COUNT(id) AS num_screenings
FROM screenings
GROUP BY film_id
)
SELECT
MIN(num_screenings) AS min_screenings,
MAX(num_screenings) AS max_screenings
FROM screening_counts;
Upvotes: 0
Reputation: 32579
The terminology for the query in your example is a derived table.
The select..from screenings
is producing what is known as a derived table, and your outer select
is using it in the context of consuming its resultset as if it were a table in its own right - and the standard SQL syntax requires it is given an alias by which to identify it, even though in this case it's the only "table".
Upvotes: 0
Reputation: 111
The a that comes in the last of your query is an alias it is a temporary name and can be use for column and table also. In your query, you are trying to fetch min id and max id from sub query.
For more research about alias click here
Upvotes: 1
Reputation: 239646
It means the dialect of SQL you're using (I think this may even be standard) requires that every subquery in the FROM
by given an alias, even if that alias is not required anywhere else in the query. Of course, you could use the alias now it's defined:
SELECT MIN(a.id),MAX(a.id)
FROM
(SELECT film_id, COUNT(id) AS id FROM screenings GROUP BY film_id) a;
But it's not usually necessary if it's clear where each column is coming from (as it is here with only one data source in the FROM
).
Upvotes: 3