powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как правильно ипользовать Having?
7 сообщений из 7, страница 1 из 1
Как правильно ипользовать Having?
    #32950784
AndPee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как правильно ипользовать Having, чтобы запрс возвращал "монитор" с Max стоимостью в таком запросе?
SELECT TblTable2.Товар, Max(TblTable2.Цена)
FROM TblTable2
WHERE (((TblTable2.Товар) Like "*монитор*"));
...
Рейтинг: 0 / 0
Как правильно ипользовать Having?
    #32950841
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndPeeКак правильно ипользовать Having, чтобы запрс возвращал "монитор" с Max стоимостью в таком запросе?
SELECT TblTable2.Товар, Max(TblTable2.Цена)
FROM TblTable2
WHERE (((TblTable2.Товар) Like "*монитор*"));


Код: plaintext
1.
2.
3.
4.
5.
SELECT TblTable2.Товар, Max(TblTable2.Цена)
FROM TblTable2
WHERE TblTable2.Товар Like "*монитор*"
Group By TblTable2.Цена
Having TblTable2.Цена=Max(TblTable2.Цена);
...
Рейтинг: 0 / 0
Как правильно ипользовать Having?
    #32950845
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только вот при использовании LIKE надо писать не '*', а - '%'
...
Рейтинг: 0 / 0
Как правильно ипользовать Having?
    #32950864
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А лучше не писать......
Вы уверены, что нельзя обойтись без запроса такого вида? Может быть, следует подумать над структурой базы?
...
Рейтинг: 0 / 0
Как правильно ипользовать Having?
    #32952856
Welly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndPeeКак правильно ипользовать Having...

SELECT TblTable2.Товар, Max(TblTable2.Цена)
...
WHERE (((TblTable2.Товар) Like "*монитор*"));

Тут нужен не HAVING, а
Код: plaintext
1.
GROUP BY TblTable2.Товар
...
Рейтинг: 0 / 0
Как правильно ипользовать Having?
    #32952996
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Welly AndPeeКак правильно ипользовать Having...

SELECT TblTable2.Товар, Max(TblTable2.Цена)
...
WHERE (((TblTable2.Товар) Like "*монитор*"));

Тут нужен не HAVING, а
Код: plaintext
1.
GROUP BY TblTable2.Товар


Кстати, действительно, ведь можно написать запрос и без использования Having . Правда тут уже надо смотреть план выполнения запроса.

Код: plaintext
1.
2.
3.
4.
5.
select goods, price
from mytable
where goods like '%монитор%'
order by price DESC
limit  0 , 1 ;
Не проверял, но можно попробовать

P.S. Есть еще один подводный камень в таком запросе: если окажется, что мониторов с максимальной ценой будет несколько.
Щас думать некогда, :) потом мей би...
...
Рейтинг: 0 / 0
Как правильно ипользовать Having?
    #32953321
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вообще примеры по теме:

MySQL 4.1.8

Код: plaintext
 1.  Создадим тестовую таблицу с юзерами, в к-рой могут быть юзеры с одинаковыми именами и возрастом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
connect test;

create table test_users (
 id int not null auto_increment,
 name varchar( 30 ) not null,
 age int( 3 ) not null,
 Primary Key(id));

insert into test_users set name=' Scott', age='32';
insert into test_users set name='Smith', age='23';
insert into test_users set name='Scott', age='12';
insert into test_users set name='Pete',  age='40';
insert into test_users set name=' Scott', age='32';

Код: plaintext
 2.  Таким образом в таблице имеется три записи о пользователях с похожими именами.
Код: plaintext
select * from test_users;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | Scott  |  32 |
|  2 | Smith  |  23 |
|  3 | Scott  |  12 |
|  4 | Pete   |  40 |
|  5 |  Scott |  32 |
+----+--------+-----+

Код: plaintext
 Запрос 1 (с использованием Having).  Найти всех пользователей с наибольшим возрастом, в  именах которых присутствует строка 'Scott'.
Код: plaintext
1.
2.
3.
4.
select id, name, age 
from test_users
where name like '%Scott%'
group by name
having age=max(age);
Код: plaintext
1.
2.
3.
4.
5.
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  5 |  Scott |  32 |
|  1 | Scott  |  32 |
+----+--------+-----+
Код: plaintext
План выполнения запроса:
Код: plaintext
1.
2.
3.
4.
+----+-------------+------------+------+---------------+--------+---------+--------+------+----------------------------------------------+
| id | select_type | table      | type | possible_keys | key    | key_len | ref    | rows | Extra                                        |
+----+-------------+------------+------+---------------+--------+---------+--------+------+----------------------------------------------+
|  1 | SIMPLE      | test_users | ALL  | [NULL]        | [NULL] |  [NULL] | [NULL] |    5 | Using where; Using temporary; Using filesort |
+----+-------------+------------+------+---------------+--------+---------+--------+------+----------------------------------------------+

Код: plaintext
 Запрос 2 (без использования Having).  --//--
Код: plaintext
1.
2.
select id, name, age 
from test_users
where age=(select max(age) from test_users where name like '%Scott%' )
Код: plaintext
1.
2.
3.
4.
5.
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | Scott  |  32 |
|  5 |  Scott |  32 |
+----+--------+-----+
Код: plaintext
 План выполнения запроса: 
Код: plaintext
1.
2.
3.
4.
5.
+----+-------------+------------+------+---------------+--------+---------+--------+------+-------------+
| id | select_type | table      | type | possible_keys | key    | key_len | ref    | rows | Extra       |
+----+-------------+------------+------+---------------+--------+---------+--------+------+-------------+
|  1 | PRIMARY     | test_users | ALL  | [NULL]        | [NULL] |  [NULL] | [NULL] |    5 | Using where |
|  2 | SUBQUERY    | test_users | ALL  | [NULL]        | [NULL] |  [NULL] | [NULL] |    5 | Using where |
+----+-------------+------------+------+---------------+--------+---------+--------+------+-------------+

Код: plaintext
 Запрос 3.  Поиск максимального значения в строке без использования фукнции  Max() 
Код: plaintext
1.
2.
3.
4.
select id, name, age 
from test_users
where name like '%Scott%'
order by age DESC
limit  0 , 1 
Код: plaintext
1.
2.
3.
4.
+----+-------+-----+
| id | name  | age |
+----+-------+-----+
|  1 | Scott |  32 |
+----+-------+-----+
Код: plaintext
 План выполнения запроса: 
Код: plaintext
1.
2.
3.
4.
+----+-------------+------------+------+---------------+--------+---------+--------+------+-----------------------------+
| id | select_type | table      | type | possible_keys | key    | key_len | ref    | rows | Extra                       |
+----+-------------+------------+------+---------------+--------+---------+--------+------+-----------------------------+
|  1 | SIMPLE      | test_users | ALL  | [NULL]        | [NULL] |  [NULL] | [NULL] |    5 | Using where; Using filesort |
+----+-------------+------------+------+---------------+--------+---------+--------+------+-----------------------------+

Проблема последнего примера в том, что он выводит только одну запись с максимальным значением, хотя на самом деле их 2.

Запрос 2 требует двойного прохода одной и той же таблицы, но не сортирует данные в отличие от 1-го и 3-го примеров.

Вообще как узнать "стоимость" запроса (аналогично explain plan в Oracle)?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как правильно ипользовать Having?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]