php - 具有挑战性的 SQL 查询
问题描述
按照这个方案,我在它们之间链接了三个表:一座建筑物有许多有很多房间的陈述。每个房间都有一个带有枚举字段(浴室、厨房...)的类型和一个区域。
这是 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;
目标是在二维 php 数组中存储每个建筑物的列表,以及每个建筑物的区域总和(按类型)。
举个例子,最终的数组应该是这样的:
Array(
[Building 1] => array(
[KitchensArea] => 52
[BathrromsAreas] => 43
)
[Building 2] => array(
[KitchensArea] => 69
[BathrromsAreas] => 74
)
)
关于如何做到这一点的任何想法?我就像完全卡住了,我认为只有一个查询是可能的,但我真的不介意它是否需要很多。
提前致谢 !
解决方案
catcon提出的CASE WHEN 声明是一件好事。如果有人想知道这里是最后的查询。
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 - 如何在sql server中获取当前年份完整月份列表和往年完整月份列表?
- c# - 某些类的 ctor 中的常见接口用法
- javascript - 在服务器上记录客户端 JavaScript 错误
- c# - 如何解决 Visual Studio 中的 NuGet 错误
- c# - 使用实体框架(代码优先方法)我只能从列表中插入 63 条记录中的一条?
- typescript - 如何为 WebStorm 和 VSCode 设置相同的代码格式样式?
- python - 组合两个数据框时保留索引
- android - 确定 Google Play 一次性产品是否有效 (IAB)
- ios - 高阶函数 sort() 将它与其他高阶函数一起使用,它也与 let 内容一起使用
- scala - 如何在 Spark Standalone 集群中提交多个作业?