Скільки машин на квартирі?

Є такі таблиці. Таблиця відношення: 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, …

Тобто логіка така:

  1. З’єднати adr з car по usrid.

  2. Порахувати кількість машин на кожну квартиру (adrid).

  3. Потім зібрати статистику: скільки квартир мають 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) і рахує кількість квартир.

Наприклад, результат може бути такий:

car_count
flats

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