powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос по макс. кол-ву совпадений
61 сообщений из 61, показаны все 3 страниц
Помогите составить запрос по макс. кол-ву совпадений
    #39039102
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть следующая таблица (первая колонка - ряд по порядку, оствльные - данные):
r c1 c2 c3 c4 c5 c6
1 1 2 3 4 5 6
2 7 8 9 10 11 12
3 2 5 8 10 16 17
4 1 3 4 6 14 16
5 3 4 6 10 12 18
6 3 4 6 15 20 21
Необходимо составить запрос, который отберет максимальное количество совпадающих чисел из каждого ряда
(возможно, не правильно сформулировал).
Например,
числа 3, 4 и 6 совпали 4 раза - в первом, в четвертом, пятом и шестом рядах.
В результате запроса чтобы были 4 (4 раза) и числа 3, 4, 6 (потому что они совпали максимальное кол-во раз).
Возможно ли такую задачу решить средствами sql?
Заранее благодарен.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039113
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvvЕсть следующая таблица (первая колонка - ряд по порядку, оствльные - данные):
r c1 c2 c3 c4 c5 c6
1 1 2 3 4 5 6
2 7 8 9 10 11 12
3 2 5 8 10 16 17
4 1 3 4 6 14 16
5 3 4 6 10 12 18
6 3 4 6 15 20 21
Необходимо составить запрос, который отберет максимальное количество совпадающих чисел из каждого ряда
(возможно, не правильно сформулировал).
Например,
числа 3, 4 и 6 совпали 4 раза - в первом, в четвертом, пятом и шестом рядах.
В результате запроса чтобы были 4 (4 раза) и числа 3, 4, 6 (потому что они совпали максимальное кол-во раз).
Возможно ли такую задачу решить средствами sql?
Заранее благодарен.
я в 1 ряду 3 совпадения нашел,в 4 -5совпадений,
больше не считал
алгоритм еще хитрей?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039115
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понял. Перефразирую.
Необходимо составить запрос, который отберет максимальное количество КОМБИНАЦИЙ совпадающих чисел из каждого ряда.
Т.е., числа 3, 4 и 6 ОДНОВРЕМЕННО НАХОДЯТСЯ В ОДНОМ РЯДУ и совпадают 4 раза - в первом, в четвертом, пятом и шестом рядах.
Еще усложнил.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039117
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага с отбором понятно, что на выходе должно быть?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039121
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если возможно, то в результате запроса чтобы фигурировало число 4 (по кол-ву ОДНОВРЕМЕННЫХ совпадений - в данном случае 4 раза) и ОБЯЗАТЕЛЬНО числа 3, 4, 6 (т.е. ТЕ ЧИСЛА, которые совпали максимальное кол-во раз).
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039135
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
структуру данных надо менять,
так точно не получится, (у меня),
еще вопрос изначально цифры 3, 4 и 6 не известны и надо их найти?
тогда получается на входе имеется только таблица?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039141
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, на входе имеется только таблица.
Числа все известны.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039143
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvv,
что значит числа все известны?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039145
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а откуда известно что группа состоит из 3 чисел
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039150
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
Ну как, есть таблица. Все данные в них известны. Может я вопрос не понял?

bochkov,
В том-то и дело, что необходимо составить запрос, который отберет максимальное количество КОМБИНАЦИЙ совпадающих чисел из каждого ряда.
Но если будет возможность еще и выбирать кол-во чисел в группе (ну, т.е., а не посмотреть ли, сколько раз группа из чисел 1 и 2 повторяется в каждой строке; или же из чисел 1, 2, 3, 4, 5) - это будет просто супер!!!
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039151
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
Пардон. Если числа, которые будут искаться, то да - они не известны.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039154
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvvвадя,
Ну как, есть таблица. Все данные в них известны. Может я вопрос не понял?

bochkov,
В том-то и дело, что необходимо составить запрос, который отберет максимальное количество КОМБИНАЦИЙ совпадающих чисел из каждого ряда.
Но если будет возможность еще и выбирать кол-во чисел в группе (ну, т.е., а не посмотреть ли, сколько раз группа из чисел 1 и 2 повторяется в каждой строке; или же из чисел 1, 2, 3, 4, 5) - это будет просто супер!!!
если к примеру количество чисел в группе от 1 до 5
то если в таблице числа от 0 до 99
то это будет примерно 100^5 вариантов
это если решать задачу в лоб,
да и главный вопрос, можно ли поменять структуру таблицы?

если вы расскажете суть вопроса то возможно
найдется оптимальное решение
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039159
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решить одним запросом - мало вероятно
использовать возможности хранимки - тогда наверно, но это будет более похоже на обыкновенное программирование
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039168
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
Решать одним запросом не обязательно.
А насчет программирования, то я и спросил вначале, возможно ли решить этот вопрос средствами sql?

bochkov,
Структуру таблицы менять можно (я имею в виду, что можно, и, наверное даже нужно, создать другую таблицу, не уничтожая исходную).
Я просто в SQL почти "ноль".
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039178
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и так если структура таблицы будет
r - номер строки
c - номер колонки
v - значение ячейки
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `tbl` (
  `r` int(11) NOT NULL,
  `c` int(11) NOT NULL,
  `v` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`r`,`c`),
  KEY `idx_tbl_v` (`v`)
)



тогда получить группы чисел и количество их совпадений
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT (SELECT COUNT(DISTINCT tt1.r) 
FROM tbl tt1
JOIN tbl tt2 ON tt1.r=tt2.r AND tt1.c<tt2.c
JOIN tbl tt3 ON tt2.r=tt3.r AND tt2.c<tt3.c
WHERE tt1.v=n1 AND tt2.v=n2 AND tt3.v=n3) cnt,
n1,n2,n3
 FROM
(SELECT DISTINCT tbl.v as n1 FROM  tbl) t1,
(SELECT DISTINCT tbl.v as n2 FROM  tbl) t2,
(SELECT DISTINCT tbl.v as n3 FROM  tbl) t3
WHERE n1<>n2 AND n2<>n3 AND n1<>n3
HAVING cnt>0
ORDER BY cnt DESC


еще добавил ограничение
в группе чисел не может быть одинаковых значений
порядок чисел обязателен
но эти ограничения можно убрать
ну и запрос выводит группы по 3 числа
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039185
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
маленько принцип запроса изменил и 5 цифирные группы вычислил
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT COUNT(DISTINCT tt1.r) cnt,
n1,n2,n3,n4,n5
 FROM  (SELECT DISTINCT tbl.v as n1 FROM  tbl) t1 
JOIN (SELECT DISTINCT tbl.v as n2 FROM  tbl) t2 ON 1
JOIN (SELECT DISTINCT tbl.v as n3 FROM  tbl) t3 ON 1
JOIN (SELECT DISTINCT tbl.v as n4 FROM  tbl) t4 ON 1
JOIN (SELECT DISTINCT tbl.v as n5 FROM  tbl) t5 ON 1
JOIN tbl tt1 ON tt1.v=n1
JOIN tbl tt2 ON tt2.v=n2 AND tt1.r=tt2.r AND tt1.c<tt2.c
JOIN tbl tt3 ON tt3.v=n3 AND tt2.r=tt3.r AND tt2.c<tt3.c
JOIN tbl tt4 ON tt4.v=n4 AND tt3.r=tt4.r AND tt3.c<tt4.c
JOIN tbl tt5 ON tt5.v=n5 AND tt4.r=tt5.r AND tt4.c<tt5.c 

WHERE n1 NOT IN(n2,n3,n4,n5) AND n2 NOT IN(n3,n4,n5) AND n3 NOT IN(n4,n5) AND n4 NOT IN(n5) 
GROUP BY n1,n2,n3,n4,n5
ORDER BY cnt DESC
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039189
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov,
Прошу прощения. Мне далеко не все понятно (выше писал - я начинающий).
Итак, по порядку:
1. Структура моей таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `table` (
	`r` INT(2) NOT NULL,
	`col_1` INT(2) NOT NULL,
	`col_2` INT(2) NOT NULL,
	`col_3` INT(2) NOT NULL,
	`col_4` INT(2) NOT NULL,
	`col_5` INT(2) NOT NULL,
	`col_6` INT(2) NOT NULL,
	PRIMARY KEY (`r`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;



2. Данные файла-csv (из моего первого поста):
r,col_1,col_2,col_3,col_4,col_5,col_6,
1,1,2,3,4,5,6,
2,7,8,9,10,11,12,
3,2,5,8,10,16,17,
4,1,3,4,6,14,16,
5,3,4,6,10,12,18,
6,3,4,6,15,20,21

Можно переписать применительно к этой таблице.
Прошу прощения за нубство.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039190
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавил csv-файл в пристежке.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039196
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvvДобавил csv-файл в пристежке.
это не csv файл...
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039197
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
применительно к вашей таблице ничего сделать нельзя
а вот в такой
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `tbl` (
  `r` int(11) NOT NULL,
  `c` int(11) NOT NULL,
  `v` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`r`,`c`),
  KEY `idx_tbl_v` (`v`)
) 


ваши данные перенес
Код: sql
1.
2.
3.
4.
5.
INSERT INTO `tbl` VALUES (1,1,1),(4,1,1),(1,2,2),(3,1,2),(1,3,3),(4,2,3),
(5,1,3),(6,1,3),(1,4,4),(4,3,4),(5,2,4),(6,2,4),(1,5,5),(3,2,5),(1,6,6),(4,4,6),
(5,3,6),(6,3,6),(2,1,7),(2,2,8),(3,3,8),(2,3,9),(2,4,10),
(3,4,10),(5,4,10),(2,5,11),(2,6,12),(5,5,12),(4,5,14),(6,4,15),(3,5,16),(4,6,16),
(3,6,17),(5,6,18),(6,5,20),(6,6,21);


вуаля
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT COUNT(DISTINCT tt1.r) cnt,
n1,n2,n3
 FROM  (SELECT DISTINCT tbl.v as n1 FROM  tbl) t1 
JOIN (SELECT DISTINCT tbl.v as n2 FROM  tbl) t2 ON 1
JOIN (SELECT DISTINCT tbl.v as n3 FROM  tbl) t3 ON 1
JOIN tbl tt1 ON tt1.v=n1
JOIN tbl tt2 ON tt2.v=n2 AND tt1.r=tt2.r AND tt1.c<tt2.c
JOIN tbl tt3 ON tt3.v=n3 AND tt2.r=tt3.r AND tt2.c<tt3.c
WHERE n1 NOT IN(n2,n3) AND n2 NOT IN(n3)
GROUP BY n1,n2,n3
ORDER BY cnt DESC
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039198
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov
ты поставил всё не так....
это уже совсем другие условия, и соответственно решение не подходит для ТС
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039200
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
не знаю,
только изменив структуру таблицы
можно на что то рассчитывать
лепить таблички в екселе,
а обрабатывать на sql - неправильно
поэтому и спросил можно ли менять структуру
еслиб автор сказал нельзя
я б даже не пытался
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039201
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяhubble.tvvДобавил csv-файл в пристежке.
это не csv файл...
правильный файл, извиняюсь ....
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039202
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkovвадя,
не знаю,
только изменив структуру таблицы
можно на что то рассчитывать
лепить таблички в екселе,
а обрабатывать на sql - неправильно
поэтому и спросил можно ли менять структуру
еслиб автор сказал нельзя
я б даже не пытался
вопрос о количестве строк в таблице тс - если не ограничено, то твой метод не катит
если это "матрица" 6*6 то к можно преобразовать таблицу тс к твоей....
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039204
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
моя структура позволяет хранить матрицу любой ширины
в отличие от оригинала
и позволяет сгенерировать все возможные группы одним запросом
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039206
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov,
Спасибо. Но скорее всего средствами SQL не получится. Я понял, что вы имели в виду, когда написали поменять структуру таблицы. На самом деле оригинальная таблица большая. Это для примера я привел 6х6.
Еще раз спасибо.
Извиняюсь за ваше потраченное время.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039207
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkovмоя структура позволяет хранить матрицу любой ширины
в отличие от оригинала
и позволяет сгенерировать все возможные группы одним запросом
видимо поздно уже :) - туплю.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039208
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько большая?
и практическое назначение таблицы и результатов (если не секрет)?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039209
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvvbochkov,
Спасибо. Но скорее всего средствами SQL не получится. Я понял, что вы имели в виду, когда написали поменять структуру таблицы. На самом деле оригинальная таблица большая. Это для примера я привел 6х6.
Еще раз спасибо.
Извиняюсь за ваше потраченное время.
трансформация данных перед обработкой-обычное дело
любую матрицу можно запихать и этим запросом обработать
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039210
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkovhubble.tvvbochkov,
Спасибо. Но скорее всего средствами SQL не получится. Я понял, что вы имели в виду, когда написали поменять структуру таблицы. На самом деле оригинальная таблица большая. Это для примера я привел 6х6.
Еще раз спасибо.
Извиняюсь за ваше потраченное время.
трансформация данных перед обработкой-обычное дело
любую матрицу можно запихать и этим запросом обработать
да, только тут вопрос упирается во время обработки..
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039211
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
все лучше чем в рукопашку
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039213
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да , причем может оказаться, что решение на sql будет самым быстрым
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039216
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
Нет, не секрет. Применение - лото.
Таблица в общем, как я уже понимаю, по меркам для обработки на sql - не большая. 6х1000

bochkov,
Остается у вас выпросить, как делается трансформация?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039217
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov,
Я имею в виду, что вы не ручным способом набивали матрицу?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039218
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не вникал, просто нашёл
получение всех перестановок (если количество значений чисел из колонок с1-6 реальное)
http://forum.sources.ru/index.php?showtopic=304456
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
    IF OBJECT_ID('AddResult') IS NOT NULL
      DROP PROCEDURE AddResult
    GO
     
    --запись результата в таблицу ResValues
    CREATE PROCEDURE AddResult
      @k int
    AS
      BEGIN
        DECLARE @i int
        DECLARE @tmpstr varchar(255)
        SET @i = 1
        SET @tmpstr = ''
            
        WHILE @i <= @k
        BEGIN
          SET @tmpstr = @tmpstr + (SELECT CAST (Value as varchar(255)) FROM TmpValues WHERE id = @i)
          SET @i = @i + 1
        END
        
        INSERT INTO ResValues VALUES (@tmpstr)
      END
    GO
     
    IF OBJECT_ID('Generate') IS NOT NULL
      DROP PROCEDURE Generate
    GO
     
    --геренация перестановок
    CREATE PROCEDURE Generate
      @n int,
      @k int
    AS
      BEGIN
     
        IF OBJECT_ID('TmpValues') IS NOT NULL
          DROP TABLE TmpValues
        --создание таблицы для хранения временных значений
        CREATE TABLE TmpValues (
          id int IDENTITY(1,1),
          Value int,
          CONSTRAINT PK_TmpValuesId PRIMARY KEY (id)
        )
     
        IF OBJECT_ID('ResValues') IS NOT NULL
          DROP TABLE ResValues
        --создание таблицы для хранения результата
        CREATE TABLE ResValues (
          id int IDENTITY(1,1),
          Result varchar(255),
          CONSTRAINT PK_ResValuesId PRIMARY KEY (id)
        )
     
        DECLARE @i int
        SET @i = 1
        --генерация первой последовательности (перестановки)
        WHILE @i <= @k
        BEGIN
          INSERT INTO TmpValues VALUES (@i)
          SET @i = @i+1
        END
        
        WHILE @i<>0
        BEGIN
          --запись результата в таблицу ResValue
          EXEC AddResult @k      
          
          SET @i = @k
          WHILE (SELECT Value FROM TmpValues WHERE id = @i) = @n - @k + @i
          BEGIN
            SET @i = @i-1
          END
          
          UPDATE TmpValues SET Value = (SELECT Value FROM TmpValues WHERE id = @i) + 1 WHERE id = @i
          
          DECLARE @j int
          DECLARE @tmp int
          SET @j = @i + 1
          
          WHILE @j <= @k
          BEGIN
            SET @tmp = (SELECT Value FROM TmpValues WHERE id = (@j-1)) + 1
            UPDATE TmpValues SET Value = @tmp WHERE id = @j
            SET @j = @j+1
          END
        END
      END



ну и далее....
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039219
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
количество значений чисел из колонок с1-6 ограниченно и чему оно равно?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039220
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда наверно проще изменить ТЗ и записывать данные сразу в в формате таблицы bochkov
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039221
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
Да, забыл. От 1 до 50.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039222
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
Если бы с нуля заполнял, то согласен, но данные УЖЕ ЕСТЬ в формате, как я показал.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039242
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select g.rows, g.qty, group_concat(g.c_val order by g.c_val)c_vals
from(
  select v.c_val, count(distinct v.r)qty, group_concat(v.r order by v.r)rows
  from(
    select t.r, elt(c.c, t.col_1, t.col_2, t.col_3, t.col_4, t.col_5, t.col_6)c_val
    from `table` t
    join(
      select 1 c union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
      )c
    )v
  group by v.c_val
  )g
group by g.rows, g.qty
order by g.qty desc
limit 1
;

rowsqtyc_vals1,4,5,643,4,6
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039244
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка: group_concat(distinct v.r order by v.r)rows
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039581
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,
Большое спасибо.
Теперь буду изучать ваш код (и не только) и учиться составлять запросы.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039589
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё-таки я не понял постановки задачи. Наверное, потому, что пример данных не очень удачен.

Скажем, изменим немножко входной массив, так, что имеется та же тройка значений (3,4 и 6), присутствующая в 4 записях, но в то же время имеется двойка значений (3 и 4), присутствующая в 5 записях... что будет целевым решением задачи?
rc1c2c3c4c5c611234562349101112325810161741346141653461012186346152021
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039655
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
3, 4, и 6
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039658
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina ,
Подставьте в запросе вместо limit 1, limit 10 и вы увидете свою пару 5 раз.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039659
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Извиняюсь. Я ошибся.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039663
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvvAkina,
3, 4, и 6
Если в дополнение к означенным найдётся вариант из 4 значений в 3 записях - он будет ещё более предпочтительным? а если 5 значений в 2 записях - то это самый предпочтительный?

Т.е. абсолютный приоритет - максимальная длина группы, а уже среди всех групп макс. длины - макс. количество записей в группе. Так?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039668
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При такой постановке задачи решение формируется в два этапа. На первом этапе выполняется поиск максимально длинных групп. А на втором уже выбирается максимальная по количеству записей группа.

hubble.tvvя и спросил вначале, возможно ли решить этот вопрос средствами sql?Да, возможно. Но целесообразность такого решения весьма сомнительна.

hubble.tvvТаблица в общем, как я уже понимаю, по меркам для обработки на sql - не большая. 6х1000
hubble.tvvОт 1 до 50.
Итого 1000 записей, в каждой 6 значений в пределах от 1 до 50... ну чё, чисто из любопытства можно повозиться.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039694
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvv,

достаточно часто применяю прием(access)-- сцепляю поля через разделитель(дополнительные разделители в начале и конце), искомые значения тоже окружаю разделителем)

удобно ---поля могут быть символьного и/или числового типа, допускается like по начальной или хвостовой части

Код: sql
1.
2.
3.
4.
5.
SELECT W1.r,
 "`" & W1.[c1] & "`" & W1.[c2] & "`" & W1.[c3] & "`" & W1.[c4] & "`" & W1.[c5] & "`" & W1.[c6] & "`" AS p1,
(InStr(p1,"`3`")>0)+(InStr(p1,"`4`")>0)+(InStr(p1,"`6`")>0) AS kol
FROM W1
order by  3,1;
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039707
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку у него 6 полей к сравнению, проще написать выражение попарного сравнения (чё там, всего 15 слагаемых), чем заниматься конкатенациями и строковыми поисками.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039869
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

6 полей*3поисковика=18 вариантов
а будет 9 или 10......................
-
------многое зависит от размера таблицы
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039941
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА, размер таблицы нам озвучен. 1к записей. 6 полей к сравнению. Значения от 1 до 50.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039972
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторAkina,
Т.е. абсолютный приоритет - максимальная длина группы, а уже среди всех групп макс. длины - макс. количество записей в группе. Так?
Да, именно так.
Но, если возможно смотреть гибко, т.е., кроме максимального кол-ва записей в группе, а, допустим, 4 в 3-х записях, то это еще лучше.

авторAkina,
Итого 1000 записей, в каждой 6 значений в пределах от 1 до 50
Тоже верно.

Но, в общем-то, мой вопрос Cygapb-007 можно сказать решил. Если вы предложите более интересный вариант, то с удовольствием посмотрю ваше решение. Мне гораздо легче обучаться на примерах профессионалов.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039976
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvvAkina,
3, 4, и 6а теперь я не понял...
допустим, есть таблица:rc1c2c3c4c5c611020304050121020304050233451112134345212223534531323363445414243
то есть, 5 чисел повторяются 2 раза, 3 числа повторяются 3 раза, в том числе 2 из них повторяются 4 раза, других повторов нет

Что является решением? 5 чисел? 3? 2?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039986
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007а теперь я не понял...
Да, вы правы. Не так работает.
Приоритет - в результате должны быть 10, 20, 30, 40, 50.
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039987
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007а теперь я не понял...
Вот та же фигня. Прискакал чел за советом, не зная точно, чего ему надо (или не умея до конца объяснить, что в общем одно и то же). Впрочем, не он первый... а, нам не привыкать, подробности вытрясем
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039988
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага... всё-таки длина - абсолютный приоритет.
Ну тогда решение верное, только сортировку взять другую, по количеству элементов, типа ORDER BY COUNT(g.c_val).
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39039996
hubble.tvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВот та же фигня. Прискакал чел за советом, не зная точно, чего ему надо (или не умея до конца объяснить, что в общем одно и то же). Впрочем, не он первый... а, нам не привыкать, подробности вытрясем
Посмотрел свои сообщения. Вроде бы все правильно я озвучил.
AkinaАга... всё-таки длина - абсолютный приоритет.
Ну тогда решение верное, только сортировку взять другую, по количеству элементов, типа ORDER BY COUNT(g.c_val).
Применил запрос с вашей корректировкой для таблицы из поста Cygapb-007 выше - не правильно отработал.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select g.rows, g.qty, group_concat(g.c_val order by g.c_val)c_vals
from(
  select v.c_val, count(distinct v.r)qty, group_concat(v.r order by v.r)rows
  from(
    select t.r, elt(c.c, t.col_1, t.col_2, t.col_3, t.col_4, t.col_5, t.col_6)c_val
    from `table` t
    join(
      select 1 c union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
      )c
    )v
  group by v.c_val
  )g
group by g.rows, g.qty
ORDER BY COUNT(g.c_val)
limit 1
;
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39040156
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hubble.tvvПрименил запрос с вашей корректировкой для таблицы из поста Cygapb-007 выше - не правильно отработал.
То, что тебе дают ответы на твои вопросы, не означает, что нужно перестать пользоваться мозгом.
Ты в каком порядке сортируешь? Нахрена тебе группа с минимальным значением количества элементов? Где DESC?
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39040905
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С максимальным числом повторов внутри строк оказалось сложнее.
В запросе предполагается, что числа внутри каждой строки числа отсортированы (по возрастанию, например), иначе не будет правильно работать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select 
    6-(c1.r is null)-(c2.r is null)-(c3.r is null)-(c4.r is null)-(c5.r is null)-(c6.r is null)retries
  , count(distinct a.r) row_qty
  , group_concat(distinct a.r order by a.r)rows
  , concat_ws(',', c1.col_1, c2.col_2, c3.col_3, c4.col_4, c5.col_5, c6.col_6)vals
from tab a
join tab b on b.r<>a.r and (
  b.col_1 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_2 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_3 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_4 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_5 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_6 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6))
left join tab c1 on c1.r=b.r and c1.col_1 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6)
left join tab c2 on c2.r=b.r and c2.col_2 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6)
left join tab c3 on c3.r=b.r and c3.col_3 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6)
left join tab c4 on c4.r=b.r and c4.col_4 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6)
left join tab c5 on c5.r=b.r and c5.col_5 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6)
left join tab c6 on c6.r=b.r and c6.col_6 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6)
group by retries, vals
having retries>1
order by retries desc, row_qty desc;

Фрагмент результата на тестовых данных:retries row_qty rows vals5 3 11,12,13 10,20,30,40,504 2 1,4 1,3,4,64 2 14,15 4,5,6,123 4 1,4,5,6 3,4,63 4 1,14,15,16 4,5,63 3 5,14,15 4,6,12

В MySQL нет конструкции TOP(1) WITH TIES , поэтому как отобрать несколько строк с одинаковым количеством максимальных совпадений, я не задумывался
...
Рейтинг: 0 / 0
Помогите составить запрос по макс. кол-ву совпадений
    #39041069
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, то есть не так, проще, конечно же...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select 
  concat_ws(',', 
    @c1:=if(b.col_1 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6),b.col_1,null),
    @c2:=if(b.col_2 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6),b.col_2,null),
    @c3:=if(b.col_3 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6),b.col_3,null),
    @c4:=if(b.col_4 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6),b.col_4,null),
    @c5:=if(b.col_5 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6),b.col_5,null),
    @c6:=if(b.col_6 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6),b.col_6,null))vals
  , 6-(@c1 is null)-(@c2 is null)-(@c3 is null)-(@c4 is null)-(@c5 is null)-(@c6 is null) retries
  , count(distinct a.r) row_qty
  , group_concat(distinct a.r order by a.r)rows
from tab a
join tab b on b.r<>a.r and (
  b.col_1 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_2 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_3 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_4 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_5 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6) or
  b.col_6 in (a.col_1,a.col_2,a.col_3,a.col_4,a.col_5,a.col_6))
group by retries, vals
having retries>1
order by retries desc, row_qty desc;
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос по макс. кол-ву совпадений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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