【问题标题】:Cumulative distinct count of multiple fields in the same table同一个表中多个字段的累积不同计数
【发布时间】:2019-11-08 20:22:14
【问题描述】:

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

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

这是 CharacterPerProperty 数据库,我在其中存储特定特征的关系和最终值。

所以基本上我想要做的是计算所有唯一的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 个可用维度一起使用。

【问题讨论】:

  • 用您正在使用的数据库标记我们的问题。
  • 完成。我添加了mysql标签。
  • CaracteristicasPorPropiedad.id_caracteristica = 1 AND CaracteristicasPorPropiedad.id_caracteristica = 2。这怎么可能是真的???它将始终返回 false,因此不会返回任何行,因此 count() 将始终为 0。
  • @Eric 我知道,关于如何在这两种情况下进行计数的任何建议?
  • 你的逻辑是什么?你想得到什么?

标签: mysql sql count distinct


【解决方案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;

【讨论】:

  • 但在这种情况下,我想要属性符合两个标准的条件,而不是一个或另一个,这是我的问题。我上面提到的查询与OR 一起使用而不是AND 给我的第二个查询给出的数字相同,但它应该减少而不是增加它。该表在一个条件下返回 264 个结果,在两个条件下返回 282 个。
  • @MihailMinkov 。 . .这仅返回同时具有这两个条件的 id_propiedad。
  • 我不确定我是否遵循,在这种情况下,如果我使用 Condition A OR Condition B 这意味着它将计算带有 A 或 B 作为参数的属性,不一定同时使用两者。这意味着如果我计算条件 A 和条件 B,它将计算同时具有条件 A 和条件 B 的属性,这是我所需要的。这就是我想要实现的目标。
  • @MihailMinkov 。 . .那是因为没有HAVING 子句就没有意义。
  • 哇,每天都能学到新东西。谢谢戈登!澄清一下,我必须用我需要的特征数量来更新HAVING COUNT(DISTINCT cpd.id_caracteristica) = 2,对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多