Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Найти наиболее часто встречающюся строку


Автор: ilyuha 28.11.2007, 17:40
Народ, помогите плиз...
есть таблица с полем Climbers с ФИО людей. нужно вытянуть наиболее часто повторяющуюся строку этого поля в таблице. например:
1-ая запись -
Иванов
Петров
Сидоров
Филатов

2-ая:
Зайцев
Медведев
Филатов
Гришин

3-ия:
Иванов
Филатов
Громов
Степин

функция, в данном случае, должна возвращать через ADOQuery значение 'Филатов'


помогите плиз smile  два дня до сдачи :'(

Автор: Nimua 29.11.2007, 17:21
а можно подробнее структуру таблицы?
у тебя в поле просто список эл-тов?

Автор: pavelv 2.12.2007, 08:17
Я так понял, что поле одно. Видимо структура таблицы не была продумана д ля решения подобного вида задачь. Из вариантов двойной цикл. Внешний по всем именам текущей колонки, внутренний по всем именам внутренних колонок. Записывать все в массив, скорее всего динамический. Что выудить различные имена из одной колонки нужно искать в строке символ #13 или (эм подскажите забыл smile ). И соот-но то, что между двумя такими символами и будет находится на разные строках. Проще решения не вижу, хотя возможно оно есть

P.S> В понедельник на работе смогу посмотреть код второго символа, если нужно будет.

Автор: Данкинг 2.12.2007, 11:27
Не понял, а Memo при чём? Да, действитетельно пример неудачный, но я бы сделал так: собрал все слова (разделённые пробелом) в один массив, а второму массиву, проходя циклом по первому, присваивал бы число повторений соответствующего слова... Как-то так, глубже сейчас думать не хочется.  smile 

Автор: kobra 2.12.2007, 15:41
можно создать временную таблицу (или даже луще постаяную) и загнав туда данные выудить запросом нужную.

Автор: Deniz 3.12.2007, 07:32
Nimua, +1
ilyuha, покажи структуру БД, укажи тип и версию СУБД, опиши все подробно, в том числе и результат, и только потом будем думать.

Автор: ilyuha 3.12.2007, 14:58
корочь, структура:
поля -
ID  LabelAscention   Climbers   MountName   MountHeight   RegionMount Country BeginingDate FinishingDate AllDayOfAscention

types -
INT TEXT MEMO TEXT INT TEXT TEXT DATE DATE INT

типы приведенны соответственно полям.
каждая запись - одно восхождение. Climbers - группа альпинистов с адресами. каждый в новой строке. надо найти альпиниста  в бд совершившего наибольшее кол-во восхождений(естественно, группы могут быть разными).

юзаю ADO+Access

Автор: Deniz 4.12.2007, 07:24
ilyuha, структура БД не совсем правильная.
Цитата(ilyuha @  3.12.2007,  17:58 Найти цитируемый пост)
Climbers - группа альпинистов с адресами. каждый в новой строке.
Вот это большая проблема.
Нужно было отдельные таблицы делать, а не в одно поле MEMO пихать все.
Классическая связь много ко многим Восхождение <-> Альпинист.
Причем лучше начать прямо сейчас переделку БД, а то потом еще попросят всех альпинистов, которые живут рядом/в одном городе/на одной улице и т.д.

Добавлено через 5 минут и 28 секунд
Да, по обработке:
1. select * from ...
2. Создать дин. массив
3. пробежать по всем записям в запросе
4. для каждой записи
4.1. выдрать ФИО из MEMO
4.2. добавить 1 к ФИО в массиве или просто добавить в массив
5. сортировать массив по кол-ву по убыванию
6. вывести массив в нужный компонент

Автор: pavelv 6.12.2007, 06:20
ilyuha действительно лучше менять структуру. Думаю самое простое завести для альпинистов отдельную таблицу в кт будут поля: ФИО Альпиниста, Инфа о нем, Уникальный код его восхождения(связь с исходной таблицей, тоесть куда он лазил и когда.), Номер альпиниста по порядку в восхождении(чтобы их различать, можно и без него обойтись конечно). Вообще Deniz описал уже процесс кодирования, но для облегчения нект задач можно вот как вывернуться. На форму поместить невидимый компонент TDBMemo который с базой будет связан и когда будешь бежать по всем записям таблицы из этого Memo построчно извлекать все фамилии альпинистов. 

Автор: ilyuha 8.12.2007, 17:00
Спасибо всем огромное! smile
да, так действительно будет намного проще и правильнее. просто, это моя первая прога работы с БД вообще - не учел я этого при продумке структуры таблицы..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)