2013-11-20 32 views
0

我已經搜索了這個,但是在這個特定的問題上找不到任何答案。對於我的數據庫類,我們必須演示如何在我們創建的數據庫上使用一些SQL函數。其中一個函數是MIN(),另一個函數是MAX()等。HAVING MIN()組合返回與HAVING MAX()相同

發生了什麼事給我的是,在運行命令時SELECT nome AS mais_barato FROM equipamento HAVING MIN(preço);(名稱在葡萄牙語:諾姆=名稱,mais_barato =便宜,equipamento =設備,PRECO =價格)的輸出如下:

+-------------+ 
| 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 | 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

非常感謝您

+0

你好,我也是巴西人,只是爲了你知道,不要在字段上使用特殊字符'preço'列應該只是'preco' –

+0

我知道特殊字符,我只是用它們因爲老師練習(他不是一個很好的老師) – RPSR1994

+0

你的查詢邏輯上不正確。 HAVING條件無法正確表達:您將使用邏輯表達式。 MySQL錯誤地解釋了bookean條件。看看@ http://sqlfiddle.com/#!2/279d2/5 –

回答

1

只是胡亂猜測:MySQL在這裏錯誤地將MIN()和MAX()解釋爲布爾值。

你的問題是不完全清楚,但我猜你只是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的,相反,正如你已經發現了,接受了很多除非您啓用嚴格模式,否則垃圾進入系統

+0

我只想要最大值/最小值的行,並且我使用子查詢來實現它,但我也試圖使用HAVING子句,因爲我沒有在練習中的任何其他地方使用它,並且我很好奇至於爲什麼MySQL使用MIN()和MAX()返回相同的值,但是後來增加了關於PostgreSQL的信息,我相信我理解了爲什麼,非常感謝 – RPSR1994

+0

在這種情況下,您希望通過...分組......preço=(SELECT MAX(preço)FROM equipamento)'。在繼續之前,一定要了解'group by'做了什麼。說實話,在Postgres中運行這些簡單的查詢:任何時候出現問題或者不清楚,Postgres會咳嗽一個錯誤,而不是盲目地做出錯誤的假設。 –

+0

然後,我將檢查PostgreSQL,並僅適用於此練習的代碼。順便說一句,你如何在MySQL中啓用嚴格模式? – RPSR1994