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

Правильный SQL запрос для реализации фильтра списка записей

17.12.2014, 21:19. Показов 1420. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!

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

Кейс:
вытягиваю из 3 полей Edittext значения , которые ввел юзер: Имя, Фамилия, Город.
потом пишу запрос , чтобы система выдала в листвью все записи удовлетворяющие условиям:
1.Показать все записи в которых поля равны введенным юзером: Имя, Фамилия, Город
2. Если юзер не ввел Имя, то отобразить все поля равные Фамилия, Город
3. Если не ввел Фамилию, то все поля равные Имя, Город
4. Если не ввел Город, то все поля равные Имя, Фамилия.
5. Если не ввел Фамилию, Имя , то все поля равные Город
6. Если не ввел Имя, Город , то все поля равные Фамилия
7. Если не ввел Фамилия , Город, то все поля равные Имя

Получается 7 условий.
Вопрос : можно ли все эти 7 условия реализовать через один SQL запрос?

Последняя моя попытка была:

SQL
1
String selectQuery = "SELECT  * FROM record WHERE (mescity='"+ city + "' OR mescity LIKE '%') AND (mesfirstname='" + fname + "' OR mesfirstname LIKE '%') AND (meslastname='" + lname + "' OR meslastname LIKE '%')";
Но тут получается, что система

Добавлено через 6 минут
Но тут получается, что система выдает все поля без исключений, так как есть LIKE условие. Если условие убрать, то будет наоборот система будет выдавать только точные результаты , если все поля заполнены.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2014, 21:19
Ответы с готовыми решениями:

SQL запрос для фильтра товаров
Добрый день. Я сейчас занимаюсь разработкой сайта с каталогом товаров и в данный момент застрял на поисковом фильтре. Имеется база данных,...

Помогите посторить правильный SQL запрос для MySQL
есть две таблицы 1. domain Содержит поля: Id domain_name 2. domain_alias domain_id alias_id первая таблица содержит...

Правильный SQL запрос
у меня есть две таблицы, которые мне нужно объеденить по одному полю. В первой таблице находятся пользователи, а во второй таблице их...

8
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 10:46
Пробуй

Java
1
2
3
4
5
String selectQuery = "SELECT  * FROM record WHERE";
 
iif (!(city.isEmpty()): selectQuery += " (mescity='+ city + "')": selectQuery += " (1)");
iif (!(fname.isEmpty()): selectQuery += " AND (mesfirstname='" + fname + "')":selectQuery += " AND (1)");
iif (!(lname.isEmpty()): selectQuery += " AND (meslastname='" + lname + "')":selectQuery += " AND (1)");
0
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 19:32  [ТС]
ДЖава в андроиде не знает такой оператор "iif" ((
/гугл тоже самое написал((/
0
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 20:06
Бывает, писал на коленке, фоксовские отголоски...

Java
1
2
3
4
5
String selectQuery = "SELECT  * FROM record WHERE";
 
selectQuery +=(!(city.isEmpty()) ? " (mescity='"+ city + "')": " (1)");
selectQuery +=(!(fname.isEmpty()) ? " AND (mesfirstname='" + fname + "')":" AND (1)");
selectQuery +=(!(lname.isEmpty()) ? " AND (meslastname='" + lname + "')":" AND (1)");
1
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
18.12.2014, 21:24
bakhman, Armagedo, здесь есть риск получить значения с кавычками и апострофами, поэтому я бы не рекомендовал использовать прямые значения. Советую ознакомиться с Правильно составить запрос, содержащий "'".
Кроме того, неясно, что будет, если пользователь не введёт значения совсем. Показывать 0 записей?
Посему условие запроса я бы переписал примерно так.
Java
1
2
3
4
5
String condition = "";
if (!city.isEmpty)
    condition += "(city = " + DatabaseUtils.sqlEscapeString(city) + ")";
if (!name.isEmpty)
    condition = (condition.isEmpty() ? "" : " AND ") + condition + "(name = " + DatabaseUtils.sqlEscapeString(name) + ")";
И то же условие для фамилии.
Затем сделать проверку condition.isEmpty, и если false, то можно делать запрос.
1
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 21:48  [ТС]
Цитата Сообщение от CoolMind Посмотреть сообщение
Кроме того, неясно, что будет, если пользователь не введёт значения совсем. Показывать 0 записей?
ну исходя из того, что пустые значения означают отсутствие критериев- просто выводятся тогда все сообщения без критериев.

Спасибо большое!! попробую сейчас
0
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 22:02
CoolMind, согласен по поводу DatabaseUtils.sqlEscapeString.

В остальном - на вкус и цвет все фломастеры разные.
Как хотИт аскер, так пусть и пишет.
Главное - идея.
Адьос
1
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 22:36  [ТС]
спасибо парни! всё работает!! запланирую попозже разобраться в этом сложном запросе

Добавлено через 10 минут
а поясните пожалуйста , что значит таинственное (1) ? - почему система разрешает иметь (1) во всех полях кроме указанного и выдает результаты?
т.е. например: SELECT * FROM record WHERE (1) AND (1) AND (1) AND (1) AND (messtime='1990-2000')
это значит что (1) - спец обозначение заполненнного поля, но любым значением?
0
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 23:13
Ничего оно не таинственное.
В SQLite нет логических истины и ложь.
Ну, оно как бы и есть там тип BOOLEAN, но на самом деле никакого true или false - нет, а есть соответствующие им целочисленные 1 и 0, которые и храянтся дальше в таблицах.
Поэтому в принципе советуют не пользоваться BOOLEAN в SQLite, чтобы не нажить себе неприятностей на одно место, а пользовать integer - 1 или 0.

Т.е. (1) здесь читай как TRUE.

Ну, а дальше свойства конъюнкции, в которых простые ТRUE никак не влияют на результат общего условия - ведь грубо - каждый ТRUE это логическое умножение на 1.
В этом собственно и фокус их такого использования.

Ну, а вводятся они с тем, чтобы при любых раскладах значений получить корректное выражение для SQL запроса.

Еще один вариант расписал CoolMind, у него не будет никаких (1) или (0).

Что больше по нутру и понятнее, то и положи в голову
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2014, 23:13
Помогаю со студенческими работами здесь

Правильный sql запрос
Нужно создать таблицу из 2 существующих таблиц, причем: 1) Все поля из таблицы1. 2) Поля, удовлетворяющих условие. Мой кривой вариант...

Правильный запрос SQL
Здравствуйте, помогите создать правельный SQL запрос. Есть таблица с заказами, каждый заказ имеет повторяющийся order.id_order. На...

Правильный запрос SQL
Здравствуйте! Скажите как правильно написать запрос... есть таблица osn_base ----------------------------------------- | data |...

Правильный SQL запрос на поиск
Приветствую всех! // подключение к бд $db_connect = new PDO('mysql:dbname=table;host=localhost', 'root', ''); // получаем...

Для реализации записей использовать списки свойств атомов. Массив записей нужно считывать из файла
Помогите с лиспом пожалуйста. Ведомость сдачи экзамена содержит следующие графы: номер по порядку, фамилия студента, номер зачётной...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru