我有一个表“位置”,其结构为:
id | property_id | location_type
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
4 | 3 | 2
5 | 4 | 1
6 | 4 | 2
我有另一个表“便利设施”,其结构为:
id | property_id | amenity_type
1 | 1 | 1
2 | 1 | 3
3 | 2 | 2
4 | 3 | 4
5 | 4 | 1
6 | 4 | 3
我有另一个表“属性”,其结构为:
id | property_id | property_type
1 | 1 | 2
2 | 1 | 3
3 | 2 | 2
4 | 3 | 4
5 | 4 | 2
6 | 4 | 3
id - 是相应表的主键。 property_id 是我的数据库的属性 ID(外键)。 location_type 是
beach (value - 1), mountain (value - 2).
amenity_type is car (value - 1), bike (value - 2), football (value - 3).
property_type is villa (value - 2), house (value - 3)
我使用以下 SQL 查询来选择 location_type = 1 AND location_type = 2 AND amenity_type = 1 AND property_type = 3 AND property_type = 1 的 property_id,即特性拥有海滩、山脉、汽车、别墅和房屋:
SELECT p.id
FROM
property AS p
JOIN
location AS l1
ON l1.property_id = p.id
AND l1.location_type = 1
JOIN
location AS l2
ON l2.property_id = p.id
AND l2.location_type = 2
JOIN
amentities AS a1
ON a1.property_id = p.id
AND a1.amenity_type = 2
JOIN
properties AS p1
ON p1.property_id = p.id
AND p1.property_type = 3
JOIN
properties AS p2
ON p2.property_id = p.id
AND p2.property_type = 1
假设我得到的 (property_id with location_type = 1 AND location_type = 2 AND amenity_type = 1 AND property_type = 3 AND property_type = 1) 的计数为 1500。我需要获取具有相同条件和其他 property_type、location_type 的计数,便利设施类型。
但是我无法使用上述查询获取以下条件的计数:
(property_id,location_type = 1 AND location_type = 2 AND amenity_type = 1 AND property_type = 3 AND property_type = 1)AND location_type = 3 的计数
(property_id,location_type = 1 AND location_type = 2 AND amenity_type = 1 AND property_type = 3 AND property_type = 1)AND location_type = 4 的计数
(property_id,location_type = 1 AND location_type = 2 AND amenity_type = 1 AND property_type = 3 AND property_type = 1)AND amenity_type = 2 的计数
(property_id,location_type = 1 AND location_type = 2 AND amenity_type = 1 AND property_type = 3 AND property_type = 1)AND amenity_type = 3 的计数
是否有任何有效的方法来获取不同 location_type、amenity_type 等的计数
请引用我之前的问题 - MySQL query - complex searching condition
最佳答案
您可以使用基本查询来获取 SELECT
列表中的所有 property.id
(并对它们进行计数)和子查询来对附加条件进行计数,如下所示:
SELECT COUNT(*) AS BaseCount
, ( SELECT COUNT(*)
FROM location AS l3
WHERE l3.property_id = p.id
AND l3.location_type = 3
) AS CountLocation3
, ( SELECT COUNT(*)
FROM location AS l4
WHERE l4.property_id = p.id
AND l4.location_type = 4
) AS CountLocation4
, ( SELECT COUNT(*)
FROM amenities AS a2
WHERE a2.property_id = p.id
AND a2.amenity_type = 2
) AS CountAmenity4
, ...
FROM
property AS p
JOIN
location AS l1
ON l1.property_id = p.id
AND l1.location_type = 1
JOIN
location AS l2
ON l2.property_id = p.id
AND l2.location_type = 2
JOIN
amentities AS a1
ON a1.property_id = p.id
AND a1.amenity_type = 1
JOIN
properties AS p3
ON p3.property_id = p.id
AND p3.property_type = 3
JOIN
properties AS p1
ON p1.property_id = p.id
AND p1.property_type = 1
关于MySQL查询-复杂计数条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7111962/