powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка с группировкой (хитрая)
38 сообщений из 38, показаны все 2 страниц
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #38911934
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
COUNT,,

Да в том то и дело, данных много, да и критериев не 3 а 5.
так что вложенность и IN крайне не желательно использовать.
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #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
Выборка с группировкой (хитрая)
    #38914646
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem07Вот, теперь правильно, итого, если хоть одно поле нескольких строк совпадает, то эти строки группируются!Хмм.. я правильно понимаю, что вы хотите такое:
Код: plaintext
1.
2.
3.
4.
5.
-в группу N входят:
--первая запись
--все записи, где первый столбец совпадает с первым столбцом начальной записи
--все записи, где второй столбец совпадает со вторым столбцом начальной записи (или с любым из уже накопившихся в группе? из примеров неясно)
-группа N сформирована
-убираем все записи группы N из общего набора и начинаем формировать группу (N+1)...
Так?
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38914648
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про сворачивание групп я не написал, но сначала бы разобраться со способом группирования...
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38914987
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

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

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

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

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

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

Так?

Отсюда:

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

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

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

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

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

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

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

Последнее - ваще не РА и только на переменных ... и будет зависеть от порядка выборки записей из БД.
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38917377
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirЯ это понимаю так, что на таких дынных
#abc1123214567345245644513575456и при условии, что начинаем мы от строки №1, в первой группе будут строки 1,2,3, 4 . Четвёртая попадёт на второй итерации наполнения первой группы (по совпадению пестолбца с уже накопившейся строкой №3).
Совершенно верно
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38917408
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem07,

Если это верно, то есть 4-я запись попадает на втором шаге итерации, то или результат будет зависеть от порядка обхода таблицы при однопроходном варианте ИЛИ надо на каждый шаг итерации делать самостоятельный просмотр.

Ибо, переставьте записи 3 и 4 местами и теперь, эта (бывшая 4-я) в выборку НЕ попадает. Или надо просматривать таблицу заново при КАЖДОМ новом включении. N^2 и не меньше итераций... это ни разу не РА. То бишь задача не для скуля.
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38917425
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109...... То бишь задача не для скуля.
Тоже уже склоняюсь к разбору на php
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38917539
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109ну и/или будет сильно зависеть от порядка накопления в группеПример, пожалуйста. Я что-то не вижу здесь зависимости от порядка накопления в группе . От порядка выбора первых записей групп - да.
Arhat109переставьте записи 3 и 4 местами и теперь, эта (бывшая 4-я) в выборку НЕ попадаетЭто не с фига ли? Я так понял, на каждой итерации надо просматривать всю таблицу, иначе какой нахрен вообще смысл в этой задаче...
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38917784
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,

Ну, тогда имеем N^2 сканов таблицы ... со всеми "вытекающими". Или задача не для скуля. Причем, по сути любого. :)
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918246
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109Artem07,

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

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

Так?

Отсюда:

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

Подскажите плиз как это реализовать?
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918327
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem07, сначала уточните, я тут 17434397 прав или нет?
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918328
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или Arhat109 здесь 17433824 прав или нет :)
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918376
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem07,

Практически стандартно. См. выбор уникальных записей... джойн таблицы самой с собой по заданным условиям, группировка и отсев всего, где HAVING COUNT() больше 1. Это может оказаться затратно в ряде случаев, но это хотя бы нормальная задача для скуля и РА в целом.

В отличии от рекурсии, которая у вас прорисовывается чуть более чем явно. :)
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918625
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirНу или Arhat109 здесь 17433824 прав или нет :)
Абсолютно прав, полностью решить все средствами скула не получится, пытаюсь извлечь максимум)
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918676
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фух, что то я совсем запутался, вернулся к "лучшему" результату 17423486
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918703
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem07Абсолютно прав, полностью решить все средствами скула не получитсяНу так если он прав, то на переменных это спокойно можно сделать, главное - определиться с порядком обхода записей. В принципе пример из фака по выборке первого/последнего в группе - практически готовое решение, вам надо только условие на попадание в группу переписать.
...
Рейтинг: 0 / 0
Выборка с группировкой (хитрая)
    #38918767
Artem07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Мне все таки больше нравится (понятнее)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT 
  group_concat(DISTINCT t.a ORDER BY t.a) AS ca,
  group_concat(DISTINCT t.b ORDER BY t.b) AS cb,
  group_concat(DISTINCT t.c  ORDER BY t.c) AS cc,
  count(*) AS total,
  test.*
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;



Только вот как отсечь на половину дублирующие строки?
Предполагал что получится использовать IN(), NOT IN()

Код: sql
1.
HAVING test.a NOT IN (test.ca)............



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


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