Халтура ннада http://www.vw-golfcl...ead.php?t=66677
Сообщение изменено: vladimir3147 (20 февраля 2015 - 15:45 )
Отправлено 20 февраля 2015 - 15:44
Халтура ннада http://www.vw-golfcl...ead.php?t=66677
Сообщение изменено: vladimir3147 (20 февраля 2015 - 15:45 )
Отправлено 27 мая 2015 - 07:04
Мужчина без женщины - всё равно, что дерево без гусеницы. © не Gra4-а, ему знакомый сказал
Отправлено 27 мая 2015 - 09:11
если я покажу свои сиськи то ты не отстанешь от них никогда, и я стану в сто раз популярнее всех баб на форуме и язык у тебя прилипнет к бороде)))) Потому что у меня очень роскошный бюст, но я ни за что не нуждаюсь, чтоб на него пялились похотливые ненасытные брюсы; // удалите сообщения с моей синей фоткой где я под феном , я вам другую поставлю)))
Отправлено 09 сентября 2015 - 17:06
В таблице БД, в колонке значения шли от 1 до n (где n - число строк) без повторов в любом порядке, но в какой-то момент в коде появился баг и некоторые числа стали повторяться, некоторые вообще пропали.
Поставлена задача - обнаружить все связанные объекты, где есть эта проблема.
Начал искать решение: мускуль не поддерживает series и их генерацию (вначале думал как-то с помощью вычитания: WHERE NOT IN).
И так и эдак пробовал подступиться - всё ерунда, очень сложно и громоздко.
Хотел уже забить на БД решение и решить через сам язык программирования, чего я делать очень не хотел, потому что надо писать доп.код, который вообще мало в делу относится, да и само решение было бы неэффективным ни по памяти, ни по времени, но случайно вспомнился такой факт:
SUM(1..n) = n * (n+1) / 2.
С помощью COUNT и SUM получил нужные значения, сравнил и вывел (HAVING) там, где не равно. Вот так школьная математика спасла кучу времени и нервов )
А мускуль всё-таки редиска.
Может кому когда пригодится, что врядли, конечно, но всё же )
Сообщение изменено: Akhenaton (09 сентября 2015 - 17:13 )
Вначале делаю, потом думаю
Отправлено 09 сентября 2015 - 17:25
Дубликаты можно выцепить, например, так:
select _id, val from (select _id, val, count(*) as aaa from test group by val) as t1 where aaa <> 1
Отчего не сделать unique?
Отправлено 09 сентября 2015 - 17:33
Да, точно.
Сгруппировать по самому значению (повторки схлопнутся) и сравнить количество. Тоже отличное решение. А я что-то зациклился на нетривиальных решениях и чуть не в ту степь вообще ушёл.
Сообщение изменено: Akhenaton (09 сентября 2015 - 17:34 )
Вначале делаю, потом думаю
Отправлено 10 сентября 2015 - 08:29
select _id, val from (select _id, val, count(*) as aaa from test group by val) as t1 where aaa <> 1
Мускул действительно это скушает? Я к тому, что группировка по _id не ведется, однако выводится и не агрегируется. Тогда, по логике, это должно дать тот же результат:
select _id, val from test group by val having count(*) > 1
unique по любому надо.
Отправлено 10 сентября 2015 - 08:55
Кстати, кроме повторок надо было еще обнаруживать "дырки".
Типо: [1,2,3,5]. 4-ка отсутствует. Или смешанный вариант, когда одна цифра пропала, а другая (другие) повторяются.
Для начала неплохо, но могут быть и false negative, к сожалению
[1,2,2,5], например, не задетектится. Но комбинированный вариант (с группировкой) может помочь.
Сообщение изменено: Akhenaton (10 сентября 2015 - 08:58 )
Вначале делаю, потом думаю
Отправлено 10 сентября 2015 - 09:06
Мускул действительно это скушает? Я к тому, что группировка по _id не ведется, однако выводится и не агрегируется. Тогда, по логике, это должно дать тот же результат:
select _id, val from test group by val having count(*) > 1
Да, это работает в мускуле и вообще мой goto метод поиска дубликатов.
Отправлено 10 сентября 2015 - 09:24
Кстати, кроме повторок надо было еще обнаруживать "дырки".
Типо: [1,2,3,5]. 4-ка отсутствует. Или смешанный вариант, когда одна цифра пропала, а другая (другие) повторяются.
Для начала неплохо, но могут быть и false negative, к сожалению![]()
[1,2,2,5], например, не задетектится. Но комбинированный вариант (с группировкой) может помочь.
Можно эмулировать generate_series запросом на подобии следующего:
select 1 + (@num:=@num + 1) from any_table, (select @num:=-1) limit xxx
Где any_table - любая таблица с кол-вом записей >= наибольшее значение val исследуемой и xxx = наибольшее значение val исследуемой.
К этому выводу left join исследуемой во val и по результату уже одним проходом можно получить и дырки и повторения.
Сообщение изменено: Vitalts (10 сентября 2015 - 09:28 )
Отправлено 10 сентября 2015 - 09:27
Можно эмулировать generate_series запросом на подобии следующего:
select 1 + (@num:=@num + 1) from any_table, (select @num:=-1) limit xxx
Да, я про это читал, но что-то совсем это дело не нравится )
Добавил "DISTINCT" в SUM - теперь детектит и [1,2,2,5]
Вначале делаю, потом думаю
Отправлено 10 сентября 2015 - 09:52
Само собой, если для разовой задачи решение уже найдено и реализовано, то к чему ломать голову над иными вариантами. Но если иные варианты все же нашлись, отчего бы их не отложить в памяти или более долгоживущем и лего доступном источнике информации на "авось пригодится"
Отправлено 10 сентября 2015 - 13:14
Vitalts, да, он нормально подзапросы обрабатывает.
Тут вообще что-то менять надо - unique ставить против повторов - раз, что-то против дырок - два. Триггер там или еще что.
Akhenaton, почему надо полагаться на последовательность в этом коде?
Сообщение изменено: Zero (10 сентября 2015 - 13:15 )
Отправлено 10 сентября 2015 - 16:11
Само собой, если для разовой задачи решение уже найдено и реализовано, то к чему ломать голову над иными вариантами. Но если иные варианты все же нашлись, отчего бы их не отложить в памяти или более долгоживущем и лего доступном источнике информации на "авось пригодится"
Да, но я особо с псевдо-series никогда не игрался в мускуле.
Надо будет разобраться.
почему надо полагаться на последовательность в этом коде?
Про какую именно последовательность речь?
Вначале делаю, потом думаю
Отправлено 10 сентября 2015 - 16:13
Akhenaton, зачем нужно это поле, к которому такие жесткие требования - последовательность без пропусков?
Отправлено 10 сентября 2015 - 16:49
Akhenaton, зачем нужно это поле, к которому такие жесткие требования - последовательность без пропусков?
Да не особо-то жесткие. Поле задаёт порядок связанных объектов, которые можно менять местами.
Вся проблема вскрылась, когда возникла необходимость сделать эту информацию доступной по api для партнёров. Для себя всё равно - если относительный порядок соблюдён, то без разницы.
А партнёру как-то не хочется выдавать такое, пересчитывать на (1..n) каждый раз - тоже.
Вначале делаю, потом думаю