Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Си-решеточник
 Аватар для Rameron
141 / 135 / 60
Регистрация: 07.02.2011
Сообщений: 669

Выбор записей по количеству совпавших полей

03.06.2013, 16:07. Показов 1151. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Возникла одна задача, но не могу придумать как оптимизировать код...

Есть в базе данных таблица с записями, в таблице, допустим, 7 колонок.

Пользователь вводит 7 значений и выбирает количество колонок по количеству совпадений. Допустим 5.

И программа должна вывести все записи из таблицы, в которых хотя-бы 5 полей совпадает со введенными ранее.

Как это нормально реализовать, помогите пожалуйста?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.06.2013, 16:07
Ответы с готовыми решениями:

Сравнение диапазонов и заливка совпавших записей
Проблема в следующем: На листе1 книги имеется несколько блоков с данными (Дата, фамилия, и должность, например: Лист1 A1:A3)...

Вывод похожих записей по тегу, а именно согласно количеству привязанных записей к тегу
Всем привет! Этот код выводит похожие записи по тегу: <?php $tags = wp_get_post_tags($post->ID); if ($tags) { $tag_ids = array();...

Запрос по нефиксированному количеству полей
Задача состоит в том, что нужно создать форму, на которой можно создавать запрос по нефиксированному количеству полей. Эту задачу почти...

4
13 / 13 / 1
Регистрация: 21.05.2013
Сообщений: 61
03.06.2013, 20:13
Если я правильно понял задачу, то не вижу в чем проблема.
Допустим у тебя все поля varchar, тогда делаешь запрос вида:
SELECT * FROM table WHERE col1 like @a1 and col2 like @ a2....
Далее в проге передаешь в параметры переменные следующего формата:
string a1 = "%"+textbox1.text + "%"
string a2 = "%"+textbox2.text + "%"
0
Си-решеточник
 Аватар для Rameron
141 / 135 / 60
Регистрация: 07.02.2011
Сообщений: 669
03.06.2013, 22:27  [ТС]
Цитата Сообщение от ImNIK Посмотреть сообщение
Если я правильно понял задачу, то не вижу в чем проблема.
Допустим у тебя все поля varchar, тогда делаешь запрос вида:
SELECT * FROM table WHERE col1 like @a1 and col2 like @ a2....
Далее в проге передаешь в параметры переменные следующего формата:
string a1 = "%"+textbox1.text + "%"
string a2 = "%"+textbox2.text + "%"
Не совсем мне кажется...

Запись может быть похожа на указанную любыми 5 (для примера) параметрами.
Совпали например колонки 1,2,3,4,5 или 1,3,5,6,7 или 1,3,4,5,7 и т.п. - их вывести.
Либо я не понял, как в предложенным тобой способе контролировать количество совпадающих колонок.

Грубо говоря - нужно выбрать записи, в которых из 7 полей с указанными совпадают любые 5.

P.S. Спасибо, что откликнулся...
0
13 / 13 / 1
Регистрация: 21.05.2013
Сообщений: 61
04.06.2013, 11:27
Ага, стал улавливать суть. Т.е. к примеру пользователь заполнил 7 текстбоксов. И должны вывести все записи которые удовлетворяют хотя-бы 5 любым условиям?
А эта цифра 5 - статична? Если именно 5 полей, то такой запрос в принципе можно написать.

Добавлено через 3 минуты
Единственно что в голову приходит это перебор всех возможных вариантов в условии... это будет нудно, но как по другому хз:
T-SQL
1
2
3
4
5
6
SELECT c1,c2,c3,c4,c5,c6,c7
FROM table
WHERE (c1 = @c1 and c2 = @c2 and c3 = @c3 and c4=@c4 and c5=@c5) 
      or (c1 = @c1 and c2 = @c2 and c3 = @c3 and c4=@c4 and c6=@c6)
    or (c1 = @c1 and c2 = @c2 and c3 = @c3 and c4=@c4 and c7=@c7)
    .................
0
Си-решеточник
 Аватар для Rameron
141 / 135 / 60
Регистрация: 07.02.2011
Сообщений: 669
04.06.2013, 13:51  [ТС]
Количество в 5 совпадений - не статично (это пример был). Он колеблется от 1 до 7 в моем случае.

Лично у меня возникла идея считать все записи с таблицы в буфер, а потом каждую запись проверить на соответствие совпадений и распределить их по группам (группа с 1 совпадением, группа с 2 совпадениями и т.д).
Писать все варианты вручную сумасшествие...

Добавлено через 2 часа 14 минут
Вышло что-то вроде:

C#
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
private DataTable[] getPackets(String strCurCode, Int32 bTermLimit, Int32 bFixPerc, Int32 bOutTake, Single nMinPerc, Single nMaxPerc, String nDepLimit, String nTakeOut)
        {
            //Создаем массив, содержащий массив таблиц в соотвествии с количеством совпадений
            DataTable[] dtResultTables = new DataTable[7];
 
            //Переменная, что хранит количество совпадений текущей записи
            int sameValues = 0;
 
            //Загружаем все записи с БД в таблицу
 
            frmDBViewer.DataInfo dtInfo = clsSQLFunctions.selectQuery("SELECT * FROM DEP_TYPE_CATALOG");
            DataTable dtAllData = dtInfo.dataSet.Tables[0];
 
            //Инициализируем массив с 7 таблицами такой же структуры.
            for (int i = 0; i < 7; i++)
            {
                dtResultTables[i] = dtAllData.Clone();
            }
 
            int nRowCount = dtAllData.Rows.Count;
 
            //Проверяем все записи на предмет соответствия
            for (int i = 0; i < nRowCount; i++)
            {
                if (dtAllData.Rows[i][1].ToString() == strCurCode)
                    sameValues++;
                if (Convert.ToInt16(dtAllData.Rows[i][3]) == bTermLimit)
                    sameValues++;
                if (Convert.ToInt16(dtAllData.Rows[i][4]) == bFixPerc)
                    sameValues++;
                if (Convert.ToInt16(dtAllData.Rows[i][5]) == bOutTake)
                    sameValues++;
 
                Single sgDepPercent = Convert.ToSingle(dtAllData.Rows[i][6]);
                if (sgDepPercent >= nMinPerc && sgDepPercent <= nMaxPerc)
                    sameValues++;
 
                if (dtAllData.Rows[i][7].ToString() == nDepLimit)
                    sameValues++;
 
                if (dtAllData.Rows[i][8].ToString() == nTakeOut)
                    sameValues++;
 
                if (sameValues > 0)
                {
                    sameValues--;
 
                    //В зависимости от количества совпадений, копируем строку в соответствующий по номеру массив (нумерация с 0)
 
                    DataRow desRow = dtResultTables[sameValues].NewRow();
                    DataRow srcRow = dtAllData.Rows[i];
 
                    desRow.ItemArray = srcRow.ItemArray.Clone() as object[];
 
                    dtResultTables[sameValues].Rows.Add(desRow);
                }
 
                sameValues = 0;
            }
 
            return dtResultTables;
        }
И вроде бы работает... Хотя может это и ресурсоемко для больших таблиц, но у меня, благо, вряд-ли размер таблицы достигнет сотни записей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2013, 13:51
Помогаю со студенческими работами здесь

Вопрос по количеству записей в отчете
Подскажите пожалуста: Есть отчет в нем листов 20, как сделать чтоб в отчете на каждой странице было количество записей находящихся на...

Пагинация с выводом по количеству записей
Всем Доброго времени суток. Такая проблема, допустим есть 100 записей в блоге, там есть пагинация и вывод по количеству записей,...

SQL сортировка по количеству записей
Допустим есть таблица, где перечислены города и улицы, например: id | City | Street ...

Вывод записей из БД и группировка по количеству
Доброго времени суток! Никогда не работал с оператором COUNT но сейчас пришлось. И я честно говоря не знаю с какой стороны зайти даже....

Вывод записей по количеству комментариев
Как вывести вывести список страниц по количеству комментариев (по убыванию) на главной странице сайта? Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru