同一张表中多个字段的累计非重复计数

时间:2019-11-08 20:22:14

标签: mysql sql count distinct

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

这是第一个“特性”表,基本上是我存储每个特性的元数据的地方。

Characteristics table

这是CharacteristicPerProperty数据库,用于存储特定特征的关系和最终值。

CharacteristicsPerProperty Table

因此,基本上我想做的是对所有唯一的id_propiedadproperty_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)

问题是该查询返回0。

如果我将AND切换为OR,则会返回282个结果。我基本上需要两者结合。我对此有些困惑。混合多个级别的查询可能是什么?该特性可用于所有10个可用尺寸。

1 个答案:

答案 0 :(得分:1)

您可以使用聚合获取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;