Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 22.01.2015
Сообщений: 40

Как сформировать SELECT * FROM tablename WHERE (а тут неизвестно сколько будет критериев) ?

19.01.2017, 16:40. Показов 604. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например если пользователь отправил ДВЕ переменные firstname=Ivan , lastname=Petrov
PHP
1
$query = "SELECT * FROM tablename WHERE  firstname='Ivan' AND  lastname='Petrov' ";
если firstname=Ivan (т.е. только одну)
PHP
1
$query = "SELECT * FROM tablename WHERE  firstname='Ivan' ";
А если отправил ТРИ переменные firstname=Ivan, lastname=Petrov, age=23
PHP
1
$query = "SELECT * FROM tablename WHERE  firstname='Ivan' AND  lastname='Petrov' AND age='23' ";
и вот как-то не знаю как эти AND-ы добавлять или вообще как правильно формируются такого рода запросы где не ясно сколько критериев поиска задаст пользователь.....

заранее спасибо за помощь или совет, тем кто подтолкнет к мысле
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.01.2017, 16:40
Ответы с готовыми решениями:

Как вставить ряд данных, если заранее неизвестно сколько будет значений ?
Здравствуйте, можете подсказать? Мне надо создать программу и я сразу столкнулся с такой проблемой, допустим мне надо сделать расчёты по...

Можно ли StoreProc в SELECT использовать var вместо TableName ?
Доброго дня всем-всем ! Можно ли в хранимой процедуре в SELECT использовать вместо имени таблицы переменную ? Т.е. допустима ли...

Как пишутся функции на выборку данных, если неизвестно будет параметр или нет?
Здравствуйте. Подскажите как правильно писать функцию в которой будет происходить запрос в базу данных на выборку данных, где...

11
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
19.01.2017, 17:04
Цитата Сообщение от новый вася Посмотреть сообщение
как эти AND-ы добавлять
ПО крайней мере 2 способа:
1. Динамически формировать запрос как строку в зависимости от того, задано условие или нет
2. Определить макс. кол. условий и написать запрос один раз в виде:
SQL
1
2
3
WHERE ((val1 IS NULL) OR (fld1 = val1))
 AND  ((val2 IS NULL) OR (fld2 = val2))
.........
1
1 / 1 / 1
Регистрация: 22.01.2015
Сообщений: 40
19.01.2017, 19:12  [ТС]
спс про второе не знал. А первое как то сразу отмел хз...

Добавлено через 1 час 36 минут
Попробовал 2 вариант. Все равно работает только если все var написать а если одну пропускаешь ничего не находит (
все еще пытаюсь найти ответ
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
20.01.2017, 09:27
Цитата Сообщение от новый вася Посмотреть сообщение
если одну пропускаешь ничего не находит
Проверь, какое значение имеют не заданные переменные. В зависимости от клиентского средства, переменные могут быть NULL, а могут принимать какое-то значение. Скажем, в Oracle если значение переменной не присвоено, то она однозначно NULL, а как в PHP - не в курсе.
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
20.01.2017, 09:59
Цитата Сообщение от новый вася Посмотреть сообщение
не знаю как эти AND-ы добавлять
если данные в массиве, то можно с помощью implode
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
20.01.2017, 14:59
Цитата Сообщение от Grossmeister Посмотреть сообщение
2. Определить макс. кол. условий и написать запрос один раз в виде:
жесть, до такого еще додуматься надо, мало того что может понадобится выборка по IS NULL так еще и гонять лишний код запроса между базой данных. Одним словом костыль еще тот.
Условия в массив и
Цитата Сообщение от Dmitry Посмотреть сообщение
с помощью implode
Dmitry, правильно ответил
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
20.01.2017, 15:10
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
так еще и гонять лишний код запроса между базой данных
Пояснить можешь?
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
20.01.2017, 15:22
Сам текст запроса.
При больших запросах имеет смысл их оформлять в виде процедур, делать вьюхи
Чтобы не гонять эти данные между вашим приложением и базой
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
20.01.2017, 15:44
Цитата Сообщение от Fedor Vlasenko
Сам текст запроса.
При больших запросах имеет смысл их оформлять в виде процедур, делать вьюхи
Чтобы не гонять эти данные между вашим приложением и базой
Как правило тест запроса достаточно небольшой по сравнению с полученными строками результата, поэтому этим трафиком можно пренебречь.

Теперь далее. Я не шибкий знаток MySQL, поэтому скажу на примере Oracle, полагаю что в остальных продвинутых СУБД что-то аналогичное.
Когда Oracle получает запрос, он сначала ищет такой же в кэше запросов. Если не находит, то производится так называемый hard parse запроса, в том числе построение плана выполнения (а это м.б. не очень быстро в общем случае). Если находит - использует его, в том числе построенный ранее план выполнения. Теперь представим себе, что человек каждый раз формирует разные запросы в зависимости от тех параметров, которые заданы и посылает их на сервер с достаточно небольшим промежутком. Значит к каждому из этих запросов строится план выполнения. Если же запрос один с учетом всех возможных параметров, то будет использоваться один раз построенный план выполнения. Т.е. в плане кэширования запросов этот вариант предпочтительней (собственно для подобных вариантов кэш запросов и был придуман).

PS
Я не в курсе, что такое implode в MySQL, вполне возможно что там этот путь эффективнее.

PPS
Опять же, в Oracle запросы переносятся в хранимые процедуры и view не для того, чтобы не пересылать большой запрос на сервер, а совершенно для других целей.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
20.01.2017, 16:34
Цитата Сообщение от Grossmeister Посмотреть сообщение
implode в MySQL
в php мы ведь в "Форум PHP и базы данных"
Цитата Сообщение от Grossmeister Посмотреть сообщение
он сначала ищет такой же в кэше запросов
и тут же проблема
Цитата Сообщение от Grossmeister Посмотреть сообщение
а совершенно для других целей
Целей может быть много и разных, я описал как можно уменьшить тело запроса. А когда таких запросов много и еще работает с удаленной базой данных, плохая скорость сети, то решение по уменьшению тела запроса имеет смысл
Статью привел первую попавшуюся
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
20.01.2017, 16:46
Цитата Сообщение от Fedor Vlasenko
то решение по уменьшению тела запроса имеет смысл
Еще раз: в общем случае тесты запросов составляют даже не проценты, а доли процентов от размера данных результатов запросов. Стоит ли овчинка выделки?

Цитата Сообщение от Fedor Vlasenko
Статью привел первую попавшуюся
Статья по MS SQL, к Oracle не имеет ни малейшего отношения. Впрочем, тут все таки MySQL (видимо), поэтому к теме прямого отношения не имеет.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
20.01.2017, 17:03
Цитата Сообщение от Grossmeister Посмотреть сообщение
Стоит ли овчинка выделки?
Да, когда очередь запросов большая, когда можно сделать просто не стоит делать костыли, чтобы потом гадать как оно работает.
Сформировав динамически запрос я могу полностью контролировать свои запросы подсовывая нужные мне данные и параметры по которым есть индексы тем самым управляя планом запроса
Где IS NULL в вашем запросе, что вы предлагаете сделать если мне нужны значения в которых Null?

Добавлено через 2 минуты
Может стоит написать один запрос по вашему мнению на все случаи жизни с одним планом :-)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2017, 17:03
Помогаю со студенческими работами здесь

Определить, сколько критериев криптостойкости выполнено
В задании требуется определить, сколько критериев криптостойкости выполнено из 4: -строчные латинсике буквы -заглавные -цифры ...

В файле input.txt записаны числа, сколько их – неизвестно
В файле input.txt записаны числа, сколько их – неизвестно. 1: Найти среднее арифметическое всех чисел и записать его в файл...

Сколько выделить памяти, если заранее неизвестно количество вложенных классов
#include <iostream> #include <locale> #include <fstream> #include <string> #include <vector> #include <stdio.h> #include...

Дан массив, количество элементов в котором неизвестно, Элементы вводятся до тех пор, пока не будет введён 0
Дан массив, количество элементов в котором неизвестно, Элементы вводятся до тех пор, пока не будет введён 0, сколько элементов массива...

Некорректная база, как сформировать select запрос
Привет знатокам! Не силен в sql запросах может кто поможет. Дано: база данных в которой 4 таблицы. --В одной - фамилии сотрудников,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru