+---------------+---------+
|Column Name |Type|+---------------+---------+
| id | int || name | varchar || activity | varchar |+---------------+---------+
id is the id of the friend andprimarykeyfor this table.
name is the name of the friend.
activity is the name of the activity which the friend takes part in.
Table: Activities
1
2
3
4
5
6
7
8
+---------------+---------+
|Column Name |Type|+---------------+---------+
| id | int || name | varchar |+---------------+---------+
id is the primarykeyfor this table.
name is the name of the activity.
Write an SQL query to find the names of all the activities with neither maximum, nor minimum number of participants.
Return the result table in any order. Each activity in table Activities is performed by any person in the table Friends.
Friends table:
+------+--------------+---------------+
| id | name | activity |+------+--------------+---------------+
|1| Jonathan D. | Eating ||2| Jade W. | Singing ||3| Victor J. | Singing ||4| Elvis Q. | Eating ||5| Daniel A. | Eating ||6| Bob B. | Horse Riding |+------+--------------+---------------+
Activities table:
+------+--------------+
| id | name |+------+--------------+
|1| Eating ||2| Singing ||3| Horse Riding |+------+--------------+
Resulttable:
+--------------+
| results |+--------------+
| Singing |+--------------+
Eating activity is performed by3 friends, maximum number of participants, (Jonathan D. , Elvis Q. and Daniel A.)
Horse Riding activity is performed by1 friend, minimum number of participants, (Bob B.)
Singing is performed by2 friends (Victor J. and Jade W.)
The key idea is to count the number of participants for each activity, then exclude activities with the maximum and minimum participant counts. This works because the problem asks for activities that are neither the most nor the least popular.
SELECT activity AS results
FROM (
SELECT a.name AS activity, COUNT(f.id) AS participant_count
FROM Activities a
JOIN Friends f ON a.name = f.activity
GROUPBY a.name
) t
WHERE participant_count NOTIN (
(SELECTMAX(cnt) FROM (
SELECTCOUNT(*) AS cnt
FROM Friends
GROUPBY activity
) x),
(SELECTMIN(cnt) FROM (
SELECTCOUNT(*) AS cnt
FROM Friends
GROUPBY activity
) y)
)