Уважаемые гуру, дайте идею как реализовать частичную группировку строк в MySQL ?
Имеется в виду вот что:
1 10
2 10
3 10
4 56
5 10
6 10
7 80
8 12
А нужно получить вот так:
1 10 3
4 56 1
5 10 2
7 80 1
8 12 1
Т.е. повторяющиеся данные сгруппированы и добавлен столбец с их количеством.
Как такое сделать ?
Примечание:
2 dimasokol
Тогда он все десятки склеит в одно, а они разделены числом 56 и поэтому должны быть сгруппированы в две разные группы.
Примечание:
>>> ## А, понял мысль. ИМХО тут неправильным проектированием БД пахнет, потому что малой кровью задачу как-то не решишь.
Нет, вроде всё правильно спроектировано. Это лог событий, надо его сгруппировать в удобочитаемый для пользователя вид, вот и всё.
Примечание:
Ловите решение. Помогли ребята с stackoverflow'а.
select
min( PreQuery.ID ) as StartIDOfGroup,
PreQuery.n,
count(*) as Cnt
from
( select yt.id,
yt.n,
@CommonGroup := @CommonGroup + if( @LastNValue = yt.n, 0, 1 ) as Common,
@LastNValue := yt.n as JustAPlaceholder
from
YourTable yt,
( select @CommonGroup := 0, @LastNValue := 0 ) SQLVars ) PreQuery
group by
PreQuery.n,
PreQuery.Common
order by
StartIDOfGroup
Примечание:
>>> А почему вы не захотели сделать то же самое средствами PHP?
Мне нужна линейная таблица, потому что планируется выводить этот лог в человекоудобном виде с пагинацией. Если делать на PHP, то чтобы вывести, например, 135ю страницу, мне придётся просчитывать все предыдущие 134 штуки. Нельзя PHP загружать такой ацкой работой))
Примечание:
Да, кэш у меня стоит на уровне HTML-блоков, думаю, надо сделать ещё и на уровне этой таблицы. Т.е. пересоздавать кэш по событию смены содержимого лога.
Спасибо.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.