У меня есть три таблицы, связанные между собой по следующей схеме: в здании много операторов, в которых много комнат. Каждый номер имеет тип с полем 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
)
)
Есть идеи о том, как это сделать? Я словно застрял, думаю, это возможно только с одним запросом, но я не против, если он займет много.
Заранее спасибо !
Заявление 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
Спасибо за вашу помощь !
Создайте два столбца в вашем SQL под названием
Is_kitchen, используя оператор case, который возвращает 1 для кухни и 0 в противном случае.
Тогда is_bathroom с той же идеей.
Затем группируем по сумме этих двух столбцов
select settlement_id,type,sum(area) from test_room group by settlement_id,type
и, возможно, присоединиться к нему, чтобы получить здание.sum(case when..
stackoverflow.com/questions/19529864/mysql-using-sum-and-case