Сложный SQL-запрос

0

У меня есть три таблицы, связанные между собой по следующей схеме: в здании много операторов, в которых много комнат. Каждый номер имеет тип с полем Enum (Ванная, Кухня...) и площадь.

Вот код SQL:

CREATE TABLE 'test_building' (
'id' int(10) unsigned NOT NULL AUTO_INCREMENT,
'flags' int(10) unsigned NOT NULL DEFAULT '0',
'name' varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
'residence_id' int(10) unsigned NOT NULL DEFAULT '0',
'status' tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ('id'),
KEY 'residence_id' ('residence_id')
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


CREATE TABLE 'test_settlement' (
'id' int(10) unsigned NOT NULL AUTO_INCREMENT,
'building_id' int(10) unsigned NOT NULL DEFAULT '0',
'flags' int(10) unsigned NOT NULL DEFAULT '0',
'name' varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
'residence_id' int(10) unsigned NOT NULL DEFAULT '0',
'status' tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ('id'),
KEY 'building_id' ('building_id')
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


CREATE TABLE 'test_room' (
'id' int(10) unsigned NOT NULL AUTO_INCREMENT,
'settlement_id' int(10) unsigned NOT NULL DEFAULT '0',
'flags' int(10) unsigned NOT NULL DEFAULT '0',
'name' varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
'type' ENUM('Chambre', 'Cuisine', 'WC', 'Salon', 'Salle de bain') NOT NULL,
'area' tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ('id'),
KEY 'settlement_id' ('settlement_id')
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Цель состоит в том, чтобы сохранить в 2D-массиве php список каждого здания и для каждого здания сумму площадей по типу.

Чтобы привести пример, окончательный массив должен выглядеть так:

Array(
    [Building 1] => array(
        [KitchensArea] => 52
        [BathrromsAreas] => 43
    )
    [Building 2] => array(
        [KitchensArea] => 69
        [BathrromsAreas] => 74
    )
)

Есть идеи о том, как это сделать? Я словно застрял, думаю, это возможно только с одним запросом, но я не против, если он займет много.

Заранее спасибо !

  • 0
    Вы можете начать с select settlement_id,type,sum(area) from test_room group by settlement_id,type и, возможно, присоединиться к нему, чтобы получить здание.
  • 1
    Соедините эти 3 таблицы, затем используйте sum(case when.. stackoverflow.com/questions/19529864/mysql-using-sum-and-case
Теги:

2 ответа

0

Заявление CASE WHEN, предложенное компанией catcon, было хорошей идеей. Если кто-нибудь когда-нибудь задумывается, вот последний запрос.

SELECT test_building.name, 
    SUM(CASE WHEN test_room.type = "Cuisine" THEN test_room.area ELSE 0 END) AS superficie_cuisine,
    SUM(CASE WHEN test_room.type = "Salle de bain" THEN test_room.area ELSE 0 END) AS superficie_salle_de_bain,
    SUM(CASE WHEN test_room.type = "Chambre" THEN test_room.area ELSE 0 END) AS superficie_chambre,
    SUM(CASE WHEN test_room.type = "WC" THEN test_room.area ELSE 0 END) AS superficie_wc,
    SUM(CASE WHEN test_room.type = "salon" THEN test_room.area ELSE 0 END) AS superficie_salon
    FROM test_building JOIN test_settlement ON test_settlement.building_id = test_building.id 
    JOIN test_room ON test_room.settlement_id = test_settlement.id 
    GROUP BY test_building.name

Спасибо за вашу помощь !

0

Создайте два столбца в вашем SQL под названием

Is_kitchen, используя оператор case, который возвращает 1 для кухни и 0 в противном случае.

Тогда is_bathroom с той же идеей.

Затем группируем по сумме этих двух столбцов

Ещё вопросы

Сообщество Overcoder
Наверх
Меню