|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Есть таблица, содержащая, в том числе, поля field1 | field2 | fiel3 | field4 51 | 1 | 0.5 | 9 48 | 0.7 | 0.5 | 2 51 | 1 | 0.5 | 9 11 | 1 | 1 | 8 51 | 1 | 1.5 | 1 51 | 1 | 0.5 | 9 Мне нужно выбрать те строки, где совпадают все значения во всех четырёх полях, в данном случае это три строки: 51 | 1 | 0.5 | 9 Перепробовал кучу способов. Все они выводят в данном примере 4 строки - все, где в первом поле 51. Есть идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2019, 14:43 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2019, 14:45 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
PS. Если fields3 - это float/double, возможны проблемы. Сменить на DECIMAL или текстовый. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2019, 14:46 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Akina Код: sql 1. 2.
Я пробовал. Выводит 51 | 0.70 | 1.00 | 1.00 51 | 0.70 | 1.00 | 0.90 51 | 0.70 | 1.00 | 0.90 51 | 0.70 | 1.00 | 1.00 51 | 0.70 | 1.00 | 1.00 51 | 0.70 | 1.00 | 1.00 51 | 0.70 | 1.00 | 0.75 51 | 0.70 | 0.50 | 1.00 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2019, 14:56 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
AkinaPS. Если fields3 - это float/double, возможны проблемы. Сменить на DECIMAL или текстовый. Первое поле int, остальные decimal ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2019, 14:57 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
DMKovЯ пробовал. ВыводитПоказывайте весь запрос. Потому как показанный вывод противоречит предложенному фрагменту. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2019, 14:03 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
AkinaПоказывайте весь запрос. Потому как показанный вывод противоречит предложенному фрагменту. Вот, только что: SELECT `field1`,`field2`,`field3`,`field4` FROM `test` WHERE `region` = 'Регион' GROUP BY `field1`,`field2`,`field3`,`field4` HAVING COUNT(*) > 1 ORDER BY `field1`,`field2`,`field3`,`field4` field1 | field2 | field3 | field4 38 | 0.70 | 0.50 | 1.00 43 | 0.70 | 0.50 | 1.00 45 | 0.70 | 0.50 | 1.00 45 | 0.70 | 1.00 | 0.90 45 | 0.70 | 1.00 | 1.00 46 | 0.70 | 0.50 | 0.90 48 | 0.70 | 1.00 | 0.90 49 | 0.70 | 1.00 | 0.90 51 | 0.70 | 1.00 | 0.75 51 | 0.70 | 1.00 | 0.90 51 | 0.70 | 1.00 | 1.00 Ну и так далее. Такая выборка даёт по 1 строке из нескольких совпадений. Т.е., например, я вижу, что в таблице есть три строки с показателями 51 | 0.70 | 1.00 | 0.90. А выводится одна. Что мне с ней делать? Мне нужно все три изменить. Вернее, две (чётное количество). Мне в одинаковых строках нужно число в первой колонке в каждой паре нечётное уменьшить на случайное число от 1 до 3, чётное - соответственно, увеличить на это же число. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2019, 11:21 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
DMKovМне нужно все три изменить. Вернее, две (чётное количество).Так. Приехали... что в начале было? DMKovМне нужно выбрать те строки Давайте всё же решать ОДНУ задачу. Давайте так. Сделайте модельный fiddle (например, на dbfiddle.uk или db-fiddle.com) на десяток записей (ну или просто тут выложите create table + insert into), покажите требуемый результат на именно этих данных, и с объяснениями, почему именно так. И будем решать именно эту задачу, не меняя и не дополняя её на полпути. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2019, 12:23 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
AkinaДавайте всё же решать ОДНУ задачу. Спасибо. Давайте. Вот сама задача: Требуется выбрать из базы данных строки, в которых четыре поля полностью совпадают, например, 51 | 0.70 | 1.00 | 1.00. Заранее неизвестно, в каких строках есть совпадения, каких именно числовых данных и сколько таких строк. Затем требуется изменить первое поле в парах на случайное число от 1 до 3. Последнее нечётное значение не меняем. Т.е., если две строчки - меняем два значения и получаем, например, 52 | 0.70 | 1.00 | 1.00 и 50 | 0.70 | 1.00 | 1.00. Если три строки - то же самое. Если четыре или пять, то меняем четыре значения и получаем, к примеру: 52 | 0.70 | 1.00 | 1.00 50 | 0.70 | 1.00 | 1.00 53 | 0.70 | 1.00 | 1.00 49 | 0.70 | 1.00 | 1.00 51 | 0.70 | 1.00 | 1.00 Если теперь вычислить поле1 * (поле2 + поле3 + поле4)/3, то средний результат в двух парных строках будет одинаковый, такой же, какой был в исходном наборе данных (51 * (0,7+1+1)/3 = 45.90). (Эти вычисления проводить не нужно) И так проходим всю таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2019, 13:40 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Теперь укажите точную версию MySQL. Ибо для 8+ можно составить достаточно эффективный запрос с использованием CTE. А вот для 5-й версии разумнее написать хранимую процедуру - решение в виде запроса там получится весьма монстрообразным. Идея в любом случае будет такая. Каждую запись дополняем двумя полями - общее количество дубликатов в группе, и номер записи в группе. После чего нечётные инкрементим, чётные декрементим, последнюю, если она нечётная, не трогаем. А вот реализация будет различаться кардинально. Ну и следует понимать, что понятие "пара" в данном случае - не существует, ибо таблица есть куча, и порядок записей в ней не определён. Просто сколько-то плюсим, сколько-то минусим... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2019, 16:36 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
AkinaТеперь укажите точную версию MySQL. Сервер: MySQL (Localhost via UNIX socket) Тип сервера: Percona Server Версия сервера: 5.7.23-24 - Percona Server (GPL), Release 24, Revision 57a9574 Версия протокола: 10 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2019, 17:59 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Ну если 5.7, то нужно что-то вроде (драфт): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 07:45 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Если же структура исходной таблицы допускает изменение (в неё допустимо добавить поле), то задача значительно упростится. Теоретически так и должно быть, если нигде в коде не используется позиционная зависимость полей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 07:48 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
AkinaНу если 5.7, то нужно что-то вроде (драфт): Ого! Вот такого никогда не делал и не додумался бы! Здорово! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 13:38 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
AkinaЕсли же структура исходной таблицы допускает изменение (в неё допустимо добавить поле), то задача значительно упростится. Теоретически так и должно быть, если нигде в коде не используется позиционная зависимость полей. да, я легко могу добавить одно или несколько полей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 13:39 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
DMKovя легко могу добавить одно или несколько полей.Ну тогда задача упрощается. добавьте поле, и первым шагом пронумеруйте записи в каждой группе (используйте переменные, см. FAQ раздела). А дальше получаете в подзапросе макс. номер для каждой группы, и на основе FLOOR(MAX(count)/2) либо плюсуете, либо минусуете, либо не трогаете. Всё уложится в два запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 13:49 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Akinaдобавьте поле, и первым шагом пронумеруйте записи в каждой группе (используйте переменные, см. FAQ раздела). А дальше получаете в подзапросе макс. номер для каждой группы, и на основе FLOOR(MAX(count)/2) либо плюсуете, либо минусуете, либо не трогаете. Всё уложится в два запроса. Это для меня непонятно. Я попробовал код выше - выдаёт ошибку: CREATE cursor cur AS SELECT field1, field2, field3, field4, cnt FROM temp; Ответ MySQL: Документация #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cursor cur as select field1, field2, field3, field4, cnt from temp' at line 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 15:20 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Ну вообще-то написанный мной код - это тело хранимой процедуры. В MySQL нет анонимного кода. Так что Вы явно забыли создать это "обрамление". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 15:36 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Ну и - коли сие драфт, то его непременно надо подрихтовать под правильный синтаксис. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 15:36 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Akina, спасибо. К сожалению, знаний не хватает, чтобы воспользоваться вашей подсказкой. Пойду длинным путём, как умею - переберу все данные. Правда, там больше 8000 строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2019, 18:09 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Akinaдобавьте поле, и первым шагом пронумеруйте записи в каждой группе (используйте переменные, см. FAQ раздела). А дальше получаете в подзапросе макс. номер для каждой группы, и на основе FLOOR(MAX(count)/2) либо плюсуете, либо минусуете, либо не трогаете. Всё уложится в два запроса. А можете подсказать эти два запроса? А то как рыба об лёд... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 13:03 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
DMKovА то как рыба об лёд...Значит, первым делом читаем FAQ: Нумерация строк и другие вопросы про использование переменных , пост "Выборка нескольких последних записей в неких группах". Отбрасываем обёртку, которая отбирает заданное количество, оставляем нумерующую начинку. Это практически первый запрос. Сделайте сначала его. Уж удалить обёртку да подставить свои имена таблицы и полей - справитесь? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 13:32 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Akina, а можно как-то получить просто выборку нужных строк, а все операции я в php сделаю? Мне нужно-то - получить все строки (id строк), где совпадают поля 1-4. Дальше я в php делаю нужные операции и update table. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 20:22 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
AkinaОтбрасываем обёртку, которая отбирает заданное количество, оставляем нумерующую начинку. Это практически первый запрос. Сделайте сначала его. Уж удалить обёртку да подставить свои имена таблицы и полей - справитесь? Мне просто логика всё равно непонятна. Какая нумерация, для чего, как её потом использовать и т.д. С БД до сих пор я работал просто, обычными запросами, без конкатов, джойнов и тем более, без переменных. Можно, конечно, погрузиться в тему. Но ради решения одной задачи? Поэтому я и хотел изначально получить все строки (id строк), где совпадают поля 1-4. Дальше я в php делаю нужные операции и update table. Да, в любом случае, спасибо за помощь - это очень интересно, я вообще понятия не имел о переменных в MySQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2019, 20:33 |
|
Выборка данных, совпадающих в разных строках по нескольким полям одновременно
|
|||
---|---|---|---|
#18+
Akina, я сделал по-своему :-) Не скажу, что решение изящное, но работает, как часы. Напомню задачу: Требуется выбрать из базы данных строки, в которых четыре поля полностью совпадают, например, 51 | 0.70 | 1.00 | 1.00. Заранее неизвестно, в каких строках есть совпадения, каких именно числовых данных и сколько таких строк. Затем требуется изменить первое поле в парах на случайное число от 1 до 3. Последнее нечётное значение не меняем. Т.е., если две строчки - меняем два значения и получаем, например, 52 | 0.70 | 1.00 | 1.00 и 50 | 0.70 | 1.00 | 1.00. Если три строки - то же самое. Если четыре или пять, то меняем четыре значения и получаем, к примеру: 52 | 0.70 | 1.00 | 1.00 50 | 0.70 | 1.00 | 1.00 53 | 0.70 | 1.00 | 1.00 49 | 0.70 | 1.00 | 1.00 51 | 0.70 | 1.00 | 1.00 Если теперь вычислить поле1 * (поле2 + поле3 + поле4)/3, то средний результат в двух парных строках будет одинаковый, такой же, какой был в исходном наборе данных (51 * (0,7+1+1)/3 = 45.90). (Эти вычисления проводить не нужно) И так проходим всю таблицу. Ну и вот что получилось: Код: php 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2019, 08:33 |
|
|
start [/forum/topic.php?fid=47&msg=39782929&tid=1829268]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 190ms |
0 / 0 |