Скільки машин на квартирі?
Є такі таблиці. Таблиця відношення: 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