同一 table 中多个字段的累计不同计数

Cumulative distinct count of multiple fields in the same table

我有一个 属性 数据库,我目前正在设计一个查询以获取属性的其他特征。在这种情况下,有问题的两个 table 是 those:

这是第一个特征 table,基本上是我为每个特征存储元数据的地方。

这是我存储特定特征的关系和最终值的 CharacteristicsPerProperty 数据库。

所以基本上我想做的是计算所有独特的 id_propiedad (property_id),这样我就可以显示我有多少具有该特定特征。查询如下

SELECT 
    COUNT(DISTINCT(CaracteristicasPorPropiedad.id_propiedad)) AS disponibles
FROM
    CaracteristicasPorPropiedad
WHERE
    CaracteristicasPorPropiedad.id_caracteristica = 1
    AND
    CaracteristicasPorPropiedad.valor = 3

所以基本上输出是这样的:

| disponibles |
|=============|
| 264         |

到目前为止一切都按预期工作,但我还可以包含另一个参数,假设在前面的示例中我包含了 Recámaras(卧室),但我还想包含 Baños(浴室)。我试过了

SELECT 
    COUNT(DISTINCT(CaracteristicasPorPropiedad.id_propiedad))
FROM
    CaracteristicasPorPropiedad
WHERE
    (CaracteristicasPorPropiedad.id_caracteristica = 1 AND CaracteristicasPorPropiedad.valor = 3)
    AND
    (CaracteristicasPorPropiedad.id_caracteristica = 2 AND CaracteristicasPorPropiedad.valor = 2.5)

问题是这个查询 returns 0.

如果我将 AND 切换为 OR,它会得到 returns 282 个结果。我基本上需要两者的结合。我对此有点困惑。混合多个级别的查询可能是什么?它可以与此特征的所有 10 个可用维度一起使用。

您可以使用聚合获得 id_propiedad

SELECT cpd.id_propiedad
FROM CaracteristicasPorPropiedad cpd
WHERE (cpd.id_caracteristica = 1 AND cpd.valor = 3) OR
      (cpd.id_caracteristica = 2 AND cpd.valor = 2.5)
GROUP BY cpd.id_propiedad
HAVING COUNT(DISTINCT cpd.id_caracteristica) = 2;

如果需要计数,请使用子查询:

SELECT COUNT(*)
FROM (SELECT cpd.id_propiedad
      FROM CaracteristicasPorPropiedad cpd
      WHERE (cpd.id_caracteristica = 1 AND cpd.valor = 3) OR
            (cpd.id_caracteristica = 2 AND cpd.valor = 2.5)
      GROUP BY cpd.id_propiedad
      HAVING COUNT(DISTINCT cpd.id_caracteristica) = 2
     ) p;