我有一个属性数据库,目前正在设计一个查询,以查询属性的其他特征。在这种情况下,有问题的两个表是那些:
这是第一个“特性”表,基本上是我存储每个特性的元数据的地方。
这是CharacteristicPerProperty数据库,用于存储特定特征的关系和最终值。
因此,基本上我想做的是对所有唯一的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)
问题是该查询返回0。
如果我将AND切换为OR,则会返回282个结果。我基本上需要两者结合。我对此有些困惑。混合多个级别的查询可能是什么?该特性可用于所有10个可用尺寸。
答案 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;