Помогите новичку с запросом

a33l

Помогите пожалуйста с запросом.Есть таблица :a 1 b 1с 2d 3e 4f 4Запрос вида : select * fromtablegroup by columnhaving count(*)>1возвращает b 1f 4как сформировать запрос чтобы получилась следующая таблица,b 1c 2d 3f 4т.е. для элементов которые имеют макимальный count для одного варианта поля с цифрой (если я правильно понял).С уважением,Алексей.
13 ответов

a33l

кого имеют???


a33l

как сформировать запрос чтобы получилась следующая таблица,b 1c 2d 3f 4
я не понял, как формируется эта таблица
т.е. для элементов которые имеют макимальный count для одного варианта поля с цифрой
если можно, то же самое по-русски :)


a33l

select max(f1),f2 from table group by f2;это чтобы получить ту фикню, которую вы хотите, но ИМХО, если уж вы не уверины - правильно-ли поняли... то мы и подавно.))) Цитируйте задание!


a33l

Извиняюсь за неточную формулировку. Попробую изложить проблему понятнее.Есть рабочая база, в ней есть таблица NetModem с большим количеством полей, в том числе с полем NetModemId. В этом поле хранятся уникальные идентификаторы записей (модемов). Есть вторая таблица Site с полями NetModemId, SiteId, Notes, Customer и т.д. Каждому NetModemId должен соответствовать один сайт Id, но по непонятным причинам, некоторым NetModemId соответствуют две записи с разным SiteId, одна из которых является рабочей (правильной), вторая - глюк.Выборка типа select * from Site group by NetModemId having count(*)>1выводит все записи, в которых дублируется NetModemId, при чем именно ту из двух, которая рабочая и которая мне нужна. Как я понимаю, по алгоритму поиска у этих записей counter больше, чем у глючных записей. Таким образом, мне нужно сделать выборку, где будут записи с уникальным значением NetModemId и записи, получаемые вышеописанным запросом.Я предположил, что можно опереться на максимальное значение counter для каждого NetModemId, но не знаю возможно ли это.Сам непосредственно с БД не работаю, а сейчас пришлось столкнуться, поэтому знания по теме минимальные.С уважением, Алексей.


a33l

не понятно, по какому принципу определять, какая из двух записей в таблице site "рабочая", а какая - "глючная", и что вы подразумеваете под "counter"


a33l

Различия рабочей записи и "глючной" определял опытным путем: в программе управления сетью изменял параметры модемов, для которых существует два SiteId, и смотрел таблицу Site. В "глючных" записях ничего не менялось, а в рабочих появились изменения. Других отличий заметить не смог, как не старался. Значение SiteId в рабочей записи может быть как больше, так и меньше значения SiteId, соответствующей "глючной". Запрос select * from Site group by NetModemId having count(*)>1 выводит только рабочие записи.Под count (смотри запрос) я понимаю число повторений значений, в данном случае NetModemId.NetModemId count 1 1 1 2 1 3Результат вышеописанного запроса, вероятно, связан с тем, что рабочая запись более свежая, чем "глючная" и по алгоритму поиска count=1 имеет глючная, а count=2 - рабочая.С уважением, Алексей.


a33l

удаляй ручками по одной записи, определяй опытным путём айдишник и удаляй.


a33l

Удалять не выход. Во первых неизвестно к чему это приведет и нет гарантии что новые глючные записи больше не появятся.Мне всего лишь нужно в итоге получить таблицу, где будут записи имеющие уникальный NetModemId и записи с двойным NetModemId но имеющие count=2.


a33l

создай полную копию и удаляй из неё ручками


a33l

В "глючных" записях ничего не менялось, а в рабочих появились изменения
Я бы попробовал привязаться к этим изменениям. или ко времени последнего изменения. Скажем, обновив у всех можемов какое-то значение - я бы изменил его в всей табличке. потом только посмотреть - когда менялась каждая запись.


a33l

Результат вышеописанного запроса, вероятно, связан с тем, что рабочая запись более свежая, чем "глючная" и по алгоритму поиска count=1 имеет глючная, а count=2 - рабочая.
что значит более "запись свежая"???если она позднее добавлена, то и id у нее будет больше, а вы говорите:
Значение SiteId в рабочей записи может быть как больше, так и меньше значения SiteId, соответствующей "глючной".


a33l

Вероятно я ошибаюсь на счет "свежей" записи, тогда непонятно почему запрос выводит только рабочие записи.По поводу удаления записей из базы, думаю это крайняя мера.Правильнее на мой взгляд написать запрос, но только какой ???Помогите пожалуйста.С уважением,Алексей


a33l

Правильнее на мой взгляд написать запрос, но только какой ???
это у вас надо спроситьпока ваш вопрос выглядит так: "помогите мне выбрать записи, только я не знаю какие!!"то, что запрос
select * from Site group by NetModemId having count(*)><b>1</b>
у вас выдает то, что нужно, ничего не значит, это чистая случайность, т.к. вы не указали аггрегатную функцию для столбца SiteId - MySQL берет первое попашееся число в этом столбце, и никакой гарантии, что оно не изменится при следующих запусках этого же запроса, нетнапример, оно может измениться если удалить строчку из таблицы, а потом добавить точно такую же - исходные данные вроде бы те же, а получите уже другой ответкстати, MS SQL вообще бы не дал вам сделать такой запрос, выдавая ошибку о том, что поле SiteID (и другие поля) не содержатся ни в аггрегатной функции, ни в операторе WHERE