【问题标题】:HAVING MIN() combination returning same as HAVING MAX()HAVING MIN() 组合返回与 HAVING MAX() 相同
【发布时间】:2013-12-04 08:01:03
【问题描述】:

我已对此进行了搜索,但找不到有关此特定问题的任何答案。对于我的数据库类,我们必须演示在我们创建的数据库上使用一些 SQL 函数。其中一个函数是 MIN(),而另一个是 MAX() 等等。

发生在我身上的是,当运行命令 SELECT nome AS mais_barato FROM equipamento HAVING MIN(preço);(名称为葡萄牙语:nome=name、mais_barato=cheaper、equipamento=equipment、preço=price)时,输出如下:

+-------------+
| mais_barato |
+-------------+
| ZON Hub     |
+-------------+

人们期望的地方(原始表格进一步如下,供您自己查看预期):

+-------------+
| mais_barato |
+-------------+
| Modem       |
+-------------+

这句话有什么问题?运行SELECT nome AS mais_caro FROM equipamento HAVING MAX(preço); (mais_caro=more_expensive) 时,输出与使用MIN(preço) 的输出相同。

原表equipamento是(cod是与设备关联的唯一代码):

+-----+----------+--------+
| cod | nome     | preço  |
+-----+----------+--------+
| 152 | ZON Hub  |    120 |
| 228 | PowerBox |    100 |
| 444 | Fibra    |    200 |
| 673 | NetGear  |     70 |
| 779 | Modem    |     50 |
+-----+----------+--------+

我在 Ubuntu 13.10 上使用 mysql Ver 14.14 Distrib 5.5.34, for debian-linux-gnu (i686) using readline 6.2

非常感谢

【问题讨论】:

  • 您好,我也是巴西人,您知道,不要在字段名称上使用特殊字符 preço 列应该只是 preco
  • 特殊字符我知道,因为老师(他不是一个很好的老师)所以我只是用它们来练习
  • 您的查询在逻辑上不正确。 HAVING 条件未正确表达:您将使用逻辑表达式。 MySQL 误解了 bookean 条件。看看@sqlfiddle.com/#!2/279d2/5
  • 是的,我现在明白我做错了什么,由于问题答案中讨论的事实,我会认真考虑迁移到 PostgreSQL

标签: mysql min having ubuntu-13.10


【解决方案1】:

只是一个疯狂的猜测:MySQL 在这里错误地将 MIN() 和 MAX() 解释为布尔值。

您的问题并不完全清楚,但我猜您只是想要一个 order by 子句:

SELECT nome AS mais_caro
FROM equipamento
ORDER BY preço DESC limit 1

如果没有,请查看子查询,例如:

SELECT nome AS mais_caro
FROM equipamento
WHERE preço = (SELECT MAX(preço) FROM equipamento);

顺便说一句,要学习 SQL,你真的应该研究 PostgreSQL。该手册非常出色,当涉及到您所犯的错误时,它非常严格、无情且内容丰富:

denis=# create table test (id serial);
CREATE TABLE
denis=# select id from test having min(id);
ERROR:  argument of HAVING must be type boolean, not type integer
LINE 1: select id from test having min(id);
                                   ^

相比之下,正如您发现的那样,除非您启用严格模式,否则 MySQL 会接受大量垃圾。

【讨论】:

  • 我只想要具有最大值/最小值的行,并且我使用子查询实现了它,但我也尝试使用 HAVING 子句,因为我没有在其他任何地方使用它练习,我很好奇为什么 MySQL 用 MIN() 和 MAX() 返回相同的值,但是后来添加了关于 PostgreSQL 的内容,我相信我明白了为什么,非常感谢
  • 在这种情况下,您需要group by … having preço = (SELECT MAX(preço) FROM equipamento)。在继续之前,请务必了解 group by 的作用。老实说,在 Postgres 中运行这些简单的查询:任何时候出现错误或不清楚的地方,Postgres 都会咳出一个错误,而不是盲目地做出错误的假设。
  • 届时我将检查 PostgreSQL,并仅针对本练习调整我的代码。顺便说一句,如何在 MySQL 中启用严格模式?
猜你喜欢
  • 2020-11-06
  • 2014-12-31
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多