居住国ごとにグループ化された投稿数に関して、一部のユーザーの年齢に関するレポートを生成する必要があります。
これが私のスキーマの簡略化されたバージョンです。
DESCRIBE countries;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(45) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
DESCRIBE users;
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| age | int(11) | NO | | NULL | |
| country_id | int(11) | NO | MUL | NULL | |
+------------+---------+------+-----+---------+----------------+
DESCRIBE posts;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| content | text | NO | | NULL | |
| user_id | int(11) | NO | MUL | NULL | |
+---------+-------------+------+-----+---------+----------------+
そして、次のような結果セットが必要です。
country.name | AVG(age of users with 0 posts) | AVG(age of users with 1-5 posts | AVG(age of users with 1-5 posts
----------------------------------------
Denmark | 17.4 | 23.2 | NULL
Germany | 20.1 | 27.8 | 34.7
England | 31.1 | NULL | 28.3
ここで、NULL は、特定のポスト カウント レベルでユーザーがいない国を表します。たとえば、デンマークでは全員が 0 ~ 5 件の投稿を持っており、それ以上の投稿はありません。NULL である必要はないと思いますが、この値が未定であることは明らかです。
これまでのところ、これは私のクエリです:
SELECT
c.name,
AVG(something) AS avg_age_with_no_posts,
AVG(something) AS `avg_age_with_1-5_posts`,
AVG(something) AS `avg_age_with_gt5_posts`
FROM
users u
JOIN posts p ON p.user_id=u.id
JOIN countries c ON c.id=u.country_id
GROUP BY c.id;
大したことではないことはわかっていますが、実際には他の句(ネストされたselect、HAVING、COUNT(CASE ... WHEN ...))をかなり(数時間)失敗させました。上記のクエリは、私が必要だとわかっている基本的なものです。
ありがとう!