Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
помогите с запросом (Виталий) 03/12/2010 - 18:01:40
      Re: помогите с запросом (voyager) 03/12/2010 - 19:36:41
      Re: помогите с запросом (bac) 03/12/2010 - 22:14:14
      Re: помогите с запросом (voyager) 06/12/2010 - 09:37:22
      Re: помогите с запросом (bac) 06/12/2010 - 19:03:26

> Original message text:
> From: Виталий - 03/12/2010 - 18:01:40
> Subject:помогите с запросом
> -----------------
> id date a b c d e
> 1 2010-12-03 1 1 1 1 1
> 2 2010-12-03 1 2 1 2 1
> 3 2010-12-03 1 1 1 1 1
> 4 2010-12-02 1 1 1 1 1
> 5 2010-12-01 1 2 1 2 1
> 6 2010-12-01 1 1 1 1 1
> 7 2010-12-01 1 2 3 1 1
>
> Нужно сделать выборку, чтобы в результате получить все строки, но без повторяющихся по полям a b c d e, при этом убираться должны только те записи, в которых стоит максимальная дата.
> Короче так:
>
> id date a b c d e
> 1 2010-12-03 1 1 1 1 1
> 2 2010-12-03 1 2 1 2 1
> 7 2010-12-01 1 2 3 1 1
>
> Пока что дошел только до такого запроса:
>
> SELECT * FROM `table` GROUP BY `a`, `b`, `c`, `d`, `e` ORDER BY `date` DESC
>
> Но почему-то не всегда работает правильно. Т.е. проблема именно в дате, иногда все повторяющиеся записи убирает, а оставляет только ту, в которой дата не самая поздняя.
>
>


From: voyager - 03/12/2010 - 19:36:41
Subject:помогите с запросом
-----------------
Дело в том, что в случае использования группировки в секции SELECT вы можете указывать для выбора только те столбцы, которые участвуют в группировке или функции. Т.е. если вы группируете по `b` - то SQL выберет вам все группы с одинаковыми значениями `b` и от них вы можете count() от каждой группы посчитать, sum() или еще что-то, но никак не какое-то `a`, потому что какое из значений `a`, соответствующих нескольким одинаковым `b` нужно взять - сервер понятия не имеет. И это только mysql позволяет подобные вольности, подставляя в качестве `a` "что попало" (случайные даты и id в вашем случае), а любая другая бд вообще выдала бы вам ошибку в подобном запросе. Сортировка же производится уже после группировки, с оставшимися "какими-попало" датами...
Отсюда вывод - если вам нужны только даты - используем функцию max(), которая как раз правильно отработает с группировкой:
select max(`date`), a,b,c,d,e from quest group by a,b,c,d,e;
Если же вам нужна вся строка целиком (с id или что там у вас еще в реале будет), соответствующая максимальной дате по сгруппированному значению - то все несколько сложнее. Можно поступить, например, так:
select q1.* from quest as q1 left join quest as q2 on (q1.a=q2.b and q1.a=q2.b and q1.c=q2.c and q1.d=q2.d and q1.e=q2.e and q1.`date`<q2.`date`) where q2.`date` is null;
Однако, в вашем примере я вижу строки у которых и дата одинаковая и набор abcde. Они выведутся обе.

Если вам этого не нужно, добавьте в конце group by q1.`date`,q1.a,q1.b,q1.c,q1.d,q1.e
Конечно, при этом мы нарушаем вышеупомянутое правило о наличии столбцов в select, но тут совершенно нет критерия какой именно id вам нужен т.к. и abcde и date одинаковые в обоих строках - т.е. mysql вернет id одной "какой-то" из них.



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
37754



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |