2013-11-20 3 views
0

Я искал это, но не смог найти ответа на этот вопрос. Для моего класса «Базы данных» мы должны продемонстрировать использование некоторых функций SQL в базе данных, которую мы создали. Одна из этих функций - MIN(), а другая - MAX() и другие.HAVING MIN() комбинация возвращается так же, как HAVING MAX()

Что происходит со мной в том, что при выполнении команды SELECT nome AS mais_barato FROM equipamento HAVING MIN(preço); (имена в португальский: нома = имя, mais_barato = дешевле, Equipamento = оборудование, preço = цена) выход заключается в следующем:

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

Я использую mysql Ver 14.14 Distrib 5.5.34, for debian-linux-gnu (i686) using readline 6.2 на Ubuntu 13.10

Большое спасибо

+0

Привет, я тоже бразильский, просто знайте, не используйте специальный символ в именах полей. Столбец 'preço' должен быть просто' preco'. –

+0

Я знаю о специальных символах, я просто использую их для упражнения из-за учителя (он не очень хороший учитель) – RPSR1994

+0

Ваш запрос логически неверен. Условие HAVING не выражено правильно: вы будете использовать логическое выражение. MySQL неверно истолковывает состояние бухгалтера. Посмотрите @ http://sqlfiddle.com/#!2/279d2/5 –

ответ

1

Просто дикий Угадайте: MySQL неправильно интерпретирует MIN() и MAX() как булевы здесь.

Ваш вопрос не совсем понятно, но я предполагаю, что вы просто хотите упорядочить по статье:

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