SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.07.2011 00:10:20

hyena
Участник
Зарегистрирован: 20.07.2011
Сообщений: 4

Помогите составить запрос: найти повторы строк и выбрать по условию

Всем привет. Пожалуйста помогите составить запрос, а то я в конец запутался.
Есть таблица где есть повторы.

+----+-------+--------+-------+
|  id  | name  | number | price   |
+----+-------+--------+-------+
| 11  | Вещь  | 111      | 10000 |
+----+-------+--------+-------+
| 11  | Вещь  | 1         | 20000 |
+----+-------+--------+-------+
| 12  | Товар | 100      | 20      |
+----+-------+--------+-------+
| 13  | Штука| 90        | 45      |
+----+-------+--------+-------+
| ....                                     |
+----+-------+--------+-------+
Как выбрать все строки с максимальной ценой, т.е. значением price?

Отредактированно hyena (21.07.2011 00:13:32)

Неактивен

 

#2 21.07.2011 14:05:04

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Помогите составить запрос: найти повторы строк и выбрать по условию

select id,max(price) from mytable group by id;

Неактивен

 

#3 21.07.2011 17:35:00

hyena
Участник
Зарегистрирован: 20.07.2011
Сообщений: 4

Re: Помогите составить запрос: найти повторы строк и выбрать по условию

evgeny написал:

select id,max(price) from mytable group by id;

Это да, но я имел виду всю строчку. Т.е. если мы выполним такой запрос то просто получим id, и максимальное значение цены.
+----+-------+
|  id  | price   |
+----+-------+
| 11  | 20000 |
+----+-------+
| 12  | 20      |
+----+-------+
| 13  | 45      |
+----+-------+

Это было бы идеально если бы не было меняющегося столбика с количеством.
Т.е.

select id, name, number, max(price) from mytable group by id;

Получим
+----+-------+--------+-------+
|  id  | name  | number | price   |
+----+-------+--------+-------+
| 11  | Вещь  | 111      | 20000 |
+----+-------+--------+-------+

А ведь нужно как бы так:
+----+-------+--------+-------+
|  id  | name  | number | price   |
+----+-------+--------+-------+
| 11  | Вещь  | 1         | 20000 |
+----+-------+--------+-------+

Тут наверное надо какой то подзапрос создать, но я чего то не вникну.
Или может просто надо тупо сделать еще столбик чтобы было так:

+----+----+-------+--------+-------+
| id   |  N  | name  | number | price   |
+----+----+-------+--------+-------+
| 1    | 11  | Вещь  | 111     | 10000 |
+----+----+-------+--------+-------+
| 2    | 11  | Вещь  | 1        | 20000  |
+----+----+-------+--------+-------+
| 3    | 12  | Товар | 100     | 20      |
+----+----+-------+----------+-----+
| 4    | 13  | Штука| 90       | 45      |
+----+----+-------+--------+-------+

И уже выбирать по новому первому столбику в котором значения не бывают разными, но все-равно тут нельзя написать -
where max(price);

Неактивен

 

#4 22.07.2011 14:16:22

hyena
Участник
Зарегистрирован: 20.07.2011
Сообщений: 4

Re: Помогите составить запрос: найти повторы строк и выбрать по условию

Самое простое решение, что придумал, это сделать так:

SELECT * FROM `mytable` WHERE `price` IN (SELECT max(`price`) FROM `mytable` GROUP BY `id`)


Но такое решение у меня уже на 3 тысячах - зависает, что уже говорить о том что у меня таких записей 30 000 тысяч ... ня(

Неактивен

 

#5 22.07.2011 17:09:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите составить запрос: найти повторы строк и выбрать по условию

Создайте составной ключик на поля id, price.

alter table `mytable` add index id_price(id,price);


Увеличилось быстродействие?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 22.07.2011 20:43:32

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Помогите составить запрос: найти повторы строк и выбрать по условию

Да, сначала

deadka написал:

Создайте составной ключик на поля id, price.
alter table `mytable` add index id_price(id,price);

А потом

SELECT mytable.* FROM
(SELECT id,max(`price`) max_price FROM `mytable` GROUP BY `id`)  maxtable
inner join mytable on(maxtable.id=mytable.id and maxtable.max_price=mytable.price)

Отредактированно evgeny (22.07.2011 20:45:49)

Неактивен

 

#7 23.07.2011 02:30:59

hyena
Участник
Зарегистрирован: 20.07.2011
Сообщений: 4

Re: Помогите составить запрос: найти повторы строк и выбрать по условию

Мужики я вас люблю!
Спасибо.

Действительно, такой запрос выполняется в десятки раз быстрее.

Знал что надо примерно такие запросы да еще с join, но составить пока еще с трудом получается.
Буду дальше изучать запросы...
И надеюсь дальше, сделаю из такой таблицы
+----+-------+--------+-------+
|  id  | name  | number | price   |
+----+-------+--------+-------+
| 11  | Вещь  | 111      | 10000 |
+----+-------+--------+-------+
| 11  | Вещь  | 1         | 20000 |
+----+-------+--------+-------+

такой вывод:
+----+-------+--------+-------+
| 11  | Вещь  | 112      | 20000 |
+----+-------+--------+-------+
самостоятельно smile

Отредактированно hyena (23.07.2011 02:31:42)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson