MySQL查询-复杂计数条件

标签 mysql optimization

我有一个表“位置”,其结构为:

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 的计数,便利设施类型。

但是我无法使用上述查询获取以下条件的计数:

  1. (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 的计数

  2. (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 的计数

  3. (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 的计数

  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 = 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/

相关文章:

python - 优化 bigint 调用

c - 从固定点 atan2() 近似中删除缓慢的 int64 除法

python - 我怎样才能使这段代码运行得更快? (在大语料库中搜索大词)

传递参数的 C++ 编译器优化

javascript - Mysql JavaScript错误: ECONNREFUSED

使用三个不同的txt文件创建mysql数据库

php - 尝试连接到 Mysql 安装 mediawiki 时权限被拒绝

gcc - exe优化

php - 一个脚本中包含大量 SELECT 和 INSERTS

php - 关于转义用户提交的 html、javascript 和 PHP 内容的概述和流程图