Скільки машин на квартирі?
Є такі таблиці. Таблиця відношення: id квартири - id мешканця:
MariaDB [kazka_db]> desc adr;
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| adrid | smallint(5) unsigned | YES | MUL | NULL | |
| usrid | smallint(5) unsigned | YES | MUL | NULL | |
+-------+----------------------+------+-----+---------+-------+
Таблиця відношення: id машини - id мешканця:
MariaDB [kazka_db]> desc car;
+--------+-----------------------+------+-----+----------+-----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+----------+-----------------+
| carid | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| usrid | smallint(5) unsigned | YES | MUL | NULL | |
+--------+-----------------------+------+-----+----------+-----------------+
Припустимо, що мешканець може бути власником тільки однієї квартири, але декількох машин. В квартирі може бути декілька мешканців. Треба зробити SQL запит: скільки квартир мають 1 машину, 2 машини, 3 машини... і т.д
О, цікаве завдання 🙂 Давай розкладемо по поличках:
adr
з’єднує мешканця (usrid
) з квартирою (adrid
).car
з’єднує мешканця (usrid
) з машиною (carid
).
Умови:
Один мешканець може мати тільки одну квартиру, але кілька машин.
В квартирі може жити кілька мешканців.
Нам треба рахувати по квартирах, скільки в них загалом машин у всіх мешканців, і згрупувати: 1 машина, 2, 3, …
Тобто логіка така:
З’єднати
adr
зcar
поusrid
.Порахувати кількість машин на кожну квартиру (
adrid
).Потім зібрати статистику: скільки квартир мають
N
машин.
SQL-запит виглядатиме так:
SELECT car_count, COUNT(*) AS flats
FROM (
SELECT a.adrid, COUNT(c.carid) AS car_count
FROM adr a
LEFT JOIN car c ON a.usrid = c.usrid
GROUP BY a.adrid
) AS sub
GROUP BY car_count
ORDER BY car_count;
Пояснення:
Внутрішній
SELECT
рахує кількість машин у кожній квартирі.Зовнішній
SELECT
уже групує по цьому числу (car_count
) і рахує кількість квартир.
Наприклад, результат може бути такий:
0
12
1
8
2
5
3
2
— це означає: 12 квартир без машин, 8 квартир з однією машиною, 5 квартир з двома і т.д.
Запит для моїх полів і таблиць:
SELECT car_count, COUNT(*) AS flats
FROM (
SELECT a.aaddr, COUNT(c.carid) AS car_count
FROM adus a
LEFT JOIN car c ON a.auser = c.cuser
GROUP BY a.aaddr
) AS sub
GROUP BY car_count
ORDER BY car_count;
Last updated