Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
2 / 2 / 0
Регистрация: 06.06.2018
Сообщений: 49

Поиск по одному или нескольким полям

12.11.2019, 21:33. Показов 4657. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Нужно сделать поиск по одному или нескольким полям
В базе есть Фамилия, Имя, Телефон.

И соответственно три поля для ввода Ф, И, Т
Сейчас программа находит только если заполнены все поля, а нужно чтобы находила даже по одному из полю. Например, есть у меня Дима Егоров 89992129345

Ищу по фамилии, выдает Дима Егоров 89992129345
Ищу по телефону, выдает Дима Егоров 89992129345


Сейчас код выглядит так и работает, только если заполнены все три поля

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
void button1_Click(object sender, EventArgs e)
        {
 
            string connStr = "server=localhost;user=root;database=people;password=root;";
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();
 
 
            string id = "'" + textBox1.Text + "'";
            string sel = $"SELECT name FROM man WHERE name = {id}";
            string id2 = "'" + textBox3.Text + "'";
            string sel2 = $"SELECT surname FROM man WHERE surname = {id2}";
            string id3 = "'" + textBox4.Text + "'";
            string sel3 = $"SELECT telephone FROM man WHERE telephone = {id3}";
 
 
            
 
            try
            {
                MySqlCommand command = new MySqlCommand(sel, conn);
                MySqlCommand command2 = new MySqlCommand(sel2, conn);
                MySqlCommand command3 = new MySqlCommand(sel3, conn);
 
 
                string name = command.ExecuteScalar().ToString();
 
                string name2 = command2.ExecuteScalar().ToString();
 
                string name3 = command3.ExecuteScalar().ToString();
                textBox2.Text = name + ' ' + name2 + ' ' + name3;
 
            }
            catch (Exception)
            {
                textBox2.Text = "нет в базе";
            }
 
 
 
            conn.Close();
 
        
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2019, 21:33
Ответы с готовыми решениями:

Фильтрация по одному или нескольким полям
Пожалуйста подскажите ,что в моем коде не так . У меня несколько эдитов . Каждый эдит относиться к определённому полю. Мне требуется...

Поиск по одному или по нескольким столбцам
Здравствуйте. У меня проблема поиска по столбцам, по всем столбцам я разобрался как организовать поиск, но мне нужно два поиска - один по 7...

Массив структур: добавление записи, удаление записи, поиск по одному или нескольким из полей
Необходимо реализовать базу данных с полями «Фамилия», «Имя», «Отчество», «Пол», «Год рождения». Каждая запись должна представлять собой...

9
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,306
13.11.2019, 06:29
Цитата Сообщение от Ворошитель Посмотреть сообщение
Сейчас код выглядит так и работает, только если заполнены все три поля
Какие "все три поля"? Тут идёт три разных поиска по трём разным строкам, а потом строки, по которым шёл поиск, склеиваются в одну. Т.е. чушь полная и несусветнейшная.

Правильный запрос должен выглядеть так:

SQL
1
SELECT name, surname, telephone FROM man WHERE name = @name OR surname = @surname OR telephone = @telephone
Т.е. ищем ИЛИ по имени ИЛИ по фамилии ИЛИ по телефону.

И используйте параметризированные запросы, а не конкатенацию. Примеров что в сети, что на этом форуме навалом. Не скатывайтесь до PHP уровня начала двухтысячных.
0
2 / 2 / 0
Регистрация: 06.06.2018
Сообщений: 49
13.11.2019, 23:03  [ТС]
Спасибо!
Но условие ИЛИ не подходит же. В результате такого запроса будет выборка некорректная.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string sel = $"SELECT name, surname, telephone FROM man WHERE name = {id1} OR surname = {id2} OR telephone = {id3}";
 
                MySqlCommand command = new MySqlCommand(sel, conn);
                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
 
                    listBox1.Items.Add(reader[0].ToString() + " " + reader[1].ToString() + " " + reader[2].ToString());
 
 
                    label1.Text = (reader[0].ToString() + " " + reader[1].ToString());
                    label2.Text = reader[2].ToString();
                }
 
                reader.Close();

В таком случае выборка идет и по имени и по фамилии.
Нужно сделать обязательно с помощью AND, но чтобы при пустом поле, он не учитывал его


Добавлено через 3 минуты
Сейчас реализовал таким способом. Работает отлично, но вероятнее всего быдлокодски

Составляю переменную из $"name LIKE {id1} AND + $" surname LIKE {id2} AND + $" telephone LIKE {id3} AND" и удаляю всегда по проверке последний AND
Соответственно если у меня введены только два поля из трех ( имя и телефон ) запросы выглядит так:
$"name LIKE {id1} AND + $" telephone LIKE {id3} AND" -(минус) AND

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
 if (textBox1.Text != "")
            {
                chek1 = $"name LIKE {id1} AND";
            }
 
            if (textBox2.Text != "")
            {
 
                chek2 = $" surname LIKE {id2} AND";
            }
 
 
            if (textBox3.Text != "")
            {
                chek3 = $" telephone LIKE {id3} AND";
            }
            string execute = chek1 + chek2 + chek3;
 
 
 
            if (execute != "")
            {
 
 
                execute = execute.Remove(execute.Length - 4);
                string sel = $"SELECT name, surname, telephone  FROM man WHERE {execute}";
               
 
                MySqlCommand command = new MySqlCommand(sel, conn);
                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
 
                    listBox1.Items.Add(reader[0].ToString() + " " + reader[1].ToString() + " " + reader[2].ToString());
 
 
                    label1.Text = (reader[0].ToString() + " " + reader[1].ToString());
                    label2.Text = reader[2].ToString();
                }
 
                reader.Close();
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
13.11.2019, 23:29
Ворошитель, вам же сказали использовать параметризованные запросы и показали как должен выглядеть запрос.
Цитата Сообщение от Ворошитель Посмотреть сообщение
но чтобы при пустом поле, он не учитывал его
Откорректировать вот так:
SQL
1
SELECT name, surname, telephone FROM man WHERE name = ISNULL(@name, name) AND surname = ISNULL(@surname, surname) AND telephone = ISNULL(@telephone, telephone)
Добавлено через 19 минут
Эм, пардон, COALESCE вместо ISNULL, ISNULL в MySql по-другому работает.
0
2 / 2 / 0
Регистрация: 06.06.2018
Сообщений: 49
14.11.2019, 01:15  [ТС]
Спасибо большое! Сейчас читаю про параметризованные запросы, думаю разберусь.

Я наверное неправильно проблему описал. Под пустым полем, я понимаю поле ввода, а не поле таблицы SQL.
Есть три поля ввода text.Box1/2/3.

Соответственно AND работает только когда все три поля ввода получили в себя данные, а нужно чтобы работал и по одному и по двум, чтобы можно было искать либо по фамилии и имени, либо по имени и телефону, либо только по имени, только по фамилии и так далее.

OR не подходит, так как он в кучу мешает и не исключает лишнее

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
    void button1_Click(object sender, EventArgs e)
        {
 
            string connStr = "server=localhost;user=root;database=people;password=root;";
            string sel = "SELECT name, surname, telephone FROM man WHERE name =  COALESCE(@name) AND surname = COALESCE(@surname) AND telephone = COALESCE( @telephone)";
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();
 
 
            MySqlCommand command = new MySqlCommand(sel, conn);
           
            MySqlParameter name = new MySqlParameter("@name", textBox1.Text);
            command.Parameters.Add(name);
            MySqlParameter surname = new MySqlParameter("@surname", textBox2.Text);
            command.Parameters.Add(surname);
            MySqlParameter telephone = new MySqlParameter("@telephone", textBox3.Text);
            command.Parameters.Add(telephone);
 
            MySqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine(reader[2].ToString()) ;  
            }
 
            reader.Close();
            conn.Close();
        }
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
14.11.2019, 02:04
А вам как показано было сделать?
Цитата Сообщение от Ворошитель Посмотреть сообщение
COALESCE(@name)
вот так?

Или вот так?
SQL
1
COALESCE(@name, name)
0
2 / 2 / 0
Регистрация: 06.06.2018
Сообщений: 49
14.11.2019, 02:23  [ТС]
Ну в смысле разницы нет, я пробовал и так и так. Результат не меняется.
Как я понял это все проверка на пустые поля таблицы SQL.
А мне нужно проверить и скипнуть пустые поля ввода - textBoxN
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,306
14.11.2019, 06:29
Ворошитель, так бы сразу и сказали. Значит нужно так:

SQL
1
2
3
4
5
6
7
8
9
10
SELECT 
    name,
    surname,
    telephone
FROM
    man
WHERE
    (COALESCE(@name, '') = '' OR name = @name) AND
    (COALESCE(@surname, '') = '' OR surname = @surname) AND
    (COALESCE(@telephone, '') ='' OR telephone = @telephone)
Ну или не прямое сравнение, а через LIKE. Это уже как вам нужнее.
0
2 / 2 / 0
Регистрация: 06.06.2018
Сообщений: 49
14.11.2019, 13:27  [ТС]
Спасибо большое! Работает
Только теперь когда все поля пустые - делается выборка всей базы
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,306
14.11.2019, 14:34
Ворошитель, ну логично. Как вы и просили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2019, 14:34
Помогаю со студенческими работами здесь

Поиск по сайту: не могу разобраться, как делать поиск по нескольким полям
поиск по одному полу осуществляется вот так: SELECT * from tablepart WHERE `marka` LIKE '%" . $search . "%' or `model` LIKE '%"...

Поиск по нескольким полям
Private Sub cmbFind_Click() Dim StrPoisk As String StrPoisk = "SELECT BasketStats.Дата, BasketStats.Лига, BasketStats.ОТ, BasketStats.,...

Поиск по нескольким полям в БД
у меня не получается реализовать поиск по нескольким полям в бд $result = mysql_query ("SELECT id,title, description, text, view,...

Поиск по нескольким полям
что то я делаю не так... если делаю так: ADOQuery1.SQL.Clear; AdoQuery1.Sql.Add('SELECT * FROM База WHERE Наименование LIKE :nam or...

Поиск по нескольким полям
Всем привет! Подскажите пожалуйста, как организовать поиск по нескольким полям. Причем может вводится 1-ое значение , а второе например...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+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