【问题标题】:有没有办法对 MYSQL 中的 TINYINT(1) 列进行 AND 操作?
【发布时间】:2022-01-23 03:46:26
【问题描述】:

我得到了下表,如果所有行都有 disponibilidad = 1,我需要返回 1

以下 QUERY 可以正常工作,但我正在寻找一种更有效的方法。

查询:

SELECT IF(AVG(disponibilidad) < 1, 0, 1) AS newResult
FROM pasteleria.compone
RIGHT JOIN pasteleria.ingredientes
    ON pasteleria.compone.id_ingrediente = pasteleria.ingredientes.id_ingrediente
WHERE id_componente = 1;

结果:

在我看来,使用“AND”会更有效率,因为它不必执行 AVG()。

【问题讨论】:

  • AVG 没有 group by 有什么意义? dev.mysql.com/doc/refman/8.0/en/…
  • 目前只是一个示例查询,如果值的 AVG 低于 1,则表示其中至少有 1 个为 0。
  • 我认为你应该改用having 子句

标签: mysql group-by boolean tinyint


【解决方案1】:

MySql 不支持像 Postgresql 的 bool_and 这样的布尔 AND 聚合函数。

为什么不简单的MIN()

SELECT MIN(disponibilidad) AS newResult
FROM pasteleria.compone
RIGHT JOIN pasteleria.ingredientes
    ON pasteleria.compone.id_ingrediente = pasteleria.ingredientes.id_ingrediente
WHERE id_componente = 1;

仅当列的所有值都为 1(假设列不可为空)时返回 1,如果至少有一行为 0,则返回 0。

【讨论】:

  • 不错,比我拥有的更好,但仍然不是我想要的答案
  • @felipesoto MySql 不支持聚合 AND 函数。这就是我发布 MIN 作为解决方案的原因。
  • 我明白,将其添加到您的答案中以接受它作为解决方案。谢谢!
【解决方案2】:

怎么样

SELECT IF(COUNT(*)>0,0,1) AS newResult
FROM pasteleria.compone
RIGHT JOIN pasteleria.ingredientes
    ON pasteleria.compone.id_ingrediente = pasteleria.ingredientes.id_ingrediente
WHERE id_componente = 1
AND disponibilidad <> 1

所以如果有任何行 disponibilidad 不是 1,则输出 0,否则如果为零(因此所有 disponibilidad 值为 1),则输出 1?

【讨论】:

  • 这与 AVG() 的解决方案几乎相同
猜你喜欢
  • 1970-01-01
  • 2022-11-25
  • 2017-12-22
  • 1970-01-01
  • 2019-09-07
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多