Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка с группировкой (хитрая) / 25 сообщений из 38, страница 1 из 2
21.03.2015, 01:36:15
    #38911701
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Доброго дня коллеги, я свою голову уже сломал, может кто подкинет умную мыслю...
Есть таблица:
tbl
a | b | c
----------
1 1 1
2 2 2
3 3 3
1 4 4
5 1 5

Нужно сгруппировать по всем полям так, чтоб результатом
select *, count(*) group by .....

было:
a | b | c | count(*)
----------
1 1 1 3
2 2 2 1
3 3 3 1

Пробовал
group by (a and b and c)
group by (a or b or c)
group by a, b, c
Результат не тот :(
...
Рейтинг: 0 / 0
21.03.2015, 01:52:55
    #38911706
COUNT,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Artem07
Код: sql
1.
2.
3.
4.
5.
a | b | c | count(*)
----------
1   1   1      3
2   2   2      1
3   3   3      1


что обозначает эта тройка ?
...
Рейтинг: 0 / 0
21.03.2015, 02:07:24
    #38911707
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
В эту тройку входит строка 4, т.к. столбец а совпадает с первой строкой и строка 5, т.к. столбец b совпадает с первой строкой
Нашел следующее решение через вложенные запросы:
Код: sql
1.
2.
3.
4.
5.
SELECT a,b,c,count(*)+ca+cb-2 as cc FROM 
  (SELECT *,count(*) as cb FROM 
    (SELECT *,count(*) as ca FROM test GROUP BY a) as tbl
  GROUP BY b) as tbl
GROUP BY c;


но подозреваю что можно гораздо проще сделать
...
Рейтинг: 0 / 0
21.03.2015, 10:06:01
    #38911784
COUNT,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Код: sql
1.
2.
3.
select t1.*,
	(select count(*) from test t2 where t2.a in (t1.a,t1.b,t1.c) or t2.b in (t1.a,t1.b,t1.c) or t2.c in (t1.a,t1.b,t1.c)) as cnt 
from test t1 where t1.a=t1.b and t1.b=t1.c
...
Рейтинг: 0 / 0
21.03.2015, 10:11:38
    #38911790
COUNT,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Даже проще, раз выбираются только строки с a=b=c
Код: sql
1.
2.
3.
select t1.*,
	(select count(*) from test t2 where t1.a in (t2.a,t2.b,t2.c)) as cnt 
from test t1 where t1.a=t1.b and t1.b=t1.c
...
Рейтинг: 0 / 0
21.03.2015, 10:33:30
    #38911800
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Да, еще подумал и решил что нужно знать какие значения сгруппированы GROUP_CONCAT(cel separate ',')

Код: sql
1.
2.
3.
4.
5.
  a |    b  | c  | count(*)
---------------------------
1,4,5  1,4,5  1     3
  2      2    2     1
  3      3    3     1
...
Рейтинг: 0 / 0
21.03.2015, 11:10:37
    #38911819
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Сори, сам уже запутался что должно получиться в итоге,
при исходных данных
Код: sql
1.
2.
3.
4.
5.
6.
7.
a | b | c
-----------------
1  1  1
2  2  2 
3  3  3 
1  4  4
5  1  5


Результат
Код: sql
1.
2.
3.
4.
5.
  a |    b  |  c  | count(*)
---------------------------
 1,5    1,4  1,4,5   3
  2      2     2     1
  3      3     3     1



А при
Код: sql
1.
2.
3.
4.
5.
6.
a | b | c
-----------------
1  1  1
2  2  2 
3  3  3 
1  4  4



Результат
Код: sql
1.
2.
3.
4.
5.
  a |    b  |  c  | count(*)
---------------------------
 1,5    1,4   1,4    2
  2      2     2     1
  3      3     3     1
...
Рейтинг: 0 / 0
21.03.2015, 12:17:09
    #38911854
COUNT,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
так же можно, корр.подзапросами сделать,
но "тяжёлый" запрос будет

как-то так (не проверял)
Код: sql
1.
2.
3.
4.
5.
6.
select t1.*,
	(select count(*) from test t2 where t1.a in (t2.a,t2.b,t2.c)) as cnt,
	(select GROUP_CONCAT(distinct t2.a order by t2.a) from test t2 where t1.a in (t2.a,t2.b,t2.c)) as gr_a, 
	(select GROUP_CONCAT(distinct t2.b order by t2.b) from test t2 where t1.a in (t2.a,t2.b,t2.c)) as gr_b, 
	(select GROUP_CONCAT(distinct t2.c order by t2.c) from test t2 where t1.a in (t2.a,t2.b,t2.c)) as gr_c 
from test t1 where t1.a=t1.b and t1.b=t1.c
...
Рейтинг: 0 / 0
21.03.2015, 14:22:32
    #38911934
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
COUNT,,

Да в том то и дело, данных много, да и критериев не 3 а 5.
так что вложенность и IN крайне не желательно использовать.
...
Рейтинг: 0 / 0
21.03.2015, 15:11:55
    #38911967
COUNT,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Artem07COUNT,,

Да в том то и дело, данных много, да и критериев не 3 а 5.
так что вложенность и IN крайне не желательно использовать.
таа, это не тот случай и не тот IN, когда за него нужно сильно волноватся.
Тут бы "помог" ms sql-ный cross apply, но в MySQL такого нет
Разве что, "склеить" результат кор.запроса, через какой-нибудь разделитель, в одно поле, и потом "разбивать" его во внешнем запросе, или на клиенте
Код: sql
1.
2.
3.
4.
select t1.*,
	(select concat(count(*),'|',GROUP_CONCAT(distinct t2.a order by t2.a),'|',GROUP_CONCAT(distinct t2.b order by t2.b),'|',GROUP_CONCAT(distinct t2.c order by t2.c) 
	from test t2 where t1.a in (t2.a,t2.b,t2.c)) as concat_result
from test t1 where t1.a=t1.b and t1.b=t1.c


пс
даа, и если вы ещё не поняли, ваш запрос отсюда - 17412891 - "ниачём"
...
Рейтинг: 0 / 0
22.03.2015, 00:48:32
    #38912182
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
COUNT,,
Прошу прощения, ввел в заблуждения постановкой задачи, поля a,b,c не обязаны быть одинаковыми, т.е. правильная постановка вопроса:
Дано:
Код: sql
1.
2.
3.
4.
5.
6.
7.
a | b | c
-----------------
a1  b1  c1
a2  b2  c2 
a3  b3  c3 
a1  b4  c4
a5  b1  c5


Результат:
Код: sql
1.
2.
3.
4.
5.
  a     |    b    |  c     | count(*)
---------------------------
a1,a5       b1,b4  c1,c4,c5  3
  a2         b2       c2     1
  a3         b3       c3     1



Дано:
Код: sql
1.
2.
3.
4.
5.
6.
a | b | c
-----------------
a1  b1  c1
a2  b2  c2 
a3  b3  c3 
a1  b4  c4


Результат:
Код: sql
1.
2.
3.
4.
5.
  a     |    b   |  c  | count(*)
---------------------------
  a1       b1,b4  c1,c4    2
  a2         b2     c2     1
  a3         b3     c3     1



Вот, теперь правильно, итого, если хоть одно поле нескольких строк совпадает, то эти строки группируются!
...
Рейтинг: 0 / 0
24.03.2015, 11:23:33
    #38914611
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Artem07,

Пока добился такого результата, если совпадение по одному полю, то все ок (на пример вариант с 4 строками),
Код: sql
1.
2.
3.
4.
5.
  a     |    b   |  c  | count(*)
---------------------------
  a1       b1,b4  c1,c4    2
  a2         b2     c2     1
  a3         b3     c3     1



А вот если по разным (вариант 5 строк), то записи повторяются
Код: sql
1.
2.
3.
4.
5.
6.
7.
  a     |    b    |   c     | count(*)
---------------------------
a1,a5       b1,b4  c1,c4,c5     3
  a2         b2       c2        1
  a3         b3       c3        1
  a1        b1,b4    c1,c4      2
a1,a5        b1      c1,c5      2


т.е. по сути строка 1 включает в себя информацию из строк 4 и 5

Вот мой не хитрый запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT 
  group_concat(DISTINCT t.a ORDER BY t.a) AS a,
  group_concat(DISTINCT t.b ORDER BY t.b) AS b,
  group_concat(DISTINCT t.c  ORDER BY t.c) AS c,
  count(*) AS total
FROM test
  LEFT JOIN test AS t ON
    (t.a=test.a OR t.b=test.b OR t.c=test.c)
GROUP BY test.a, test.b, test.c;



Подскажите, как избавиться от лишних строк?
...
Рейтинг: 0 / 0
24.03.2015, 11:36:52
    #38914646
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Artem07Вот, теперь правильно, итого, если хоть одно поле нескольких строк совпадает, то эти строки группируются!Хмм.. я правильно понимаю, что вы хотите такое:
Код: plaintext
1.
2.
3.
4.
5.
-в группу N входят:
--первая запись
--все записи, где первый столбец совпадает с первым столбцом начальной записи
--все записи, где второй столбец совпадает со вторым столбцом начальной записи (или с любым из уже накопившихся в группе? из примеров неясно)
-группа N сформирована
-убираем все записи группы N из общего набора и начинаем формировать группу (N+1)...
Так?
...
Рейтинг: 0 / 0
24.03.2015, 11:37:53
    #38914648
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Про сворачивание групп я не написал, но сначала бы разобраться со способом группирования...
...
Рейтинг: 0 / 0
24.03.2015, 14:13:54
    #38914987
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
tanglir,

tanglirArtem07Вот, теперь правильно, итого, если хоть одно поле нескольких строк совпадает, то эти строки группируются!Хмм.. я правильно понимаю, что вы хотите такое:
Код: plaintext
1.
2.
3.
4.
5.
-в группу N входят:
--первая запись
--все записи, где первый столбец совпадает с первым столбцом начальной записи
--все записи, где второй столбец совпадает со вторым столбцом начальной записи (или с любым из уже накопившихся в группе? из примеров неясно)
-группа N сформирована
-убираем все записи группы N из общего набора и начинаем формировать группу (N+1)...
Так?
Да, совершенно верно!
Даже можно так:
-в группу N входят:
--первая запись
--все записи, где ЛЮБОЙ столбец совпадает таким-же столбцом записи из уже накопившихся в группе
-группа N сформирована
.......
...
Рейтинг: 0 / 0
24.03.2015, 19:49:12
    #38915567
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
по-моему, такое только циклами в хранимке можно сделать...
...
Рейтинг: 0 / 0
25.03.2015, 00:05:05
    #38915776
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Artem07...
Вот, теперь правильно, итого, если хоть одно поле нескольких строк совпадает, то эти строки группируются!
Типы полей какие ?
...
Рейтинг: 0 / 0
25.03.2015, 08:02:38
    #38915878
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
скукотищаArtem07...
Вот, теперь правильно, итого, если хоть одно поле нескольких строк совпадает, то эти строки группируются!
Типы полей какие ?
varchar 20, int 10
...
Рейтинг: 0 / 0
25.03.2015, 08:23:41
    #38915883
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
скукотищаArtem07...
Вот, теперь правильно, итого, если хоть одно поле нескольких строк совпадает, то эти строки группируются!
Типы полей какие ?
Если это поможет, то можно все к int привести
...
Рейтинг: 0 / 0
25.03.2015, 11:03:07
    #38916126
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
tanglir,

Ну почему только "циклами и в ХП"? Думаю можно сваять что-то нетривиальное на переменных... но лениво. :)
...
Рейтинг: 0 / 0
25.03.2015, 11:25:13
    #38916156
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Arhat109,
а если потом использовать джоин он a NOT IN (a)....
...
Рейтинг: 0 / 0
25.03.2015, 18:07:40
    #38916867
Artem07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Arhat109tanglir,

Ну почему только "циклами и в ХП"? Думаю можно сваять что-то нетривиальное на переменных... но лениво. :)
Не сочтите за труд хоть намекнуть :)
...
Рейтинг: 0 / 0
25.03.2015, 19:33:06
    #38916922
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Artem07,

Отталкивался от этой постановки задачи:

автор-в группу N входят:
--первая запись
--все записи, где первый столбец совпадает с первым столбцом начальной записи
--все записи, где второй столбец совпадает со вторым столбцом начальной записи (или с любым из уже накопившихся в группе? из примеров неясно)
-группа N сформирована
-убираем все записи группы N из общего набора и начинаем формировать группу (N+1)...

Так?

Отсюда:

1. "Родонасяльником группы" могут быть только записи с не повторяющимися комбинациями значений. Ну или "заданное" начало. Это самый внутренний подзапрос отлавливающий все "N".

2. К каждой записи отсюда джойним все те, которые совпадают по первому ключу, по второму и т.д.

Собственно на этом этапе даже "мудрить не надо" составное условие для ON на совпадении первого ключа ИЛИ второго ИЛИ третьего.

После чего группируем всё это барахло по составному интегральному ключу из всех трех и ву-а-ля считаем ваш COUNT().

Тут даже на переменных нечего делать. :)
...
Рейтинг: 0 / 0
26.03.2015, 05:00:29
    #38917180
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
Arhat109Тут даже на переменных нечего делать. :)
Artem07--все записи, где ЛЮБОЙ столбец совпадает таким-же столбцом записи из уже накопившихся в группеЯ это понимаю так, что на таких дынных
#abc1123214567345245644513575456и при условии, что начинаем мы от строки №1, в первой группе будут строки 1,2,3, 4 . Четвёртая попадёт на второй итерации наполнения первой группы (по совпадению первого столбца с уже накопившейся строкой №3). Ваш вариант тут не подходит.
...
Рейтинг: 0 / 0
26.03.2015, 09:28:31
    #38917305
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой (хитрая)
tanglir,

Да, сначала надо уточнить ТЗ: совпадение требуется только с первым в группе или с любым накопившимся?

Второй вариант, с высокой долей вероятности вытащит всю таблицу, ну и/или будет сильно зависеть от порядка накопления в группе. :)

Последнее - ваще не РА и только на переменных ... и будет зависеть от порядка выборки записей из БД.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка с группировкой (хитрая) / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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