посмотрите на эту таблицу
table
|id| |name| |order|
я должен получить строки, где name = something
и order = somevalue
таким образом, я пишу
select `id` from `table` where `name` = 'something' and `order` = 'somevalue'
но зависьте от php логики, иногда я должен получить все строки, где name = something
, независимо от order
значение. я не хочу изменять структуру запроса, потому что в практике существуют многие количество полей, и возможное количество запросов станет очень большим. таким образом, я хочу сохранить структуру запроса, и когда я должен выбрать просто по имени, я хочу записать что-то вроде этого:
select `id` from `table` where `name` = 'something' and `order` = any value
действительно ли это возможно?
спасибо
Ну, это своего рода хак, но если вам действительно нужно это сделать, это будет работать так:
select `id` from `table` where `name` = 'something' and `order` = `order`
Тогда вы просто говорите "везде, где порядок совпадает с самим собой", так что это всегда верно.
Как Чад сказал выше, просто установите столбец равным самому себе. Но будьте осторожны, на некоторых платформах / конфигурациях установки NULL! = NULL:
select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'')
Нет, это невозможно. Вам нужно изменить структуру (необязательно на LIKE, чтобы вы могли использовать '%', но это очень некрасиво).
Однако вам не нужно писать разные запросы для обработки всех возможных комбинаций.Вы можете просто создать запрос динамически:
//create base query
$query = "select `id` from `table` where `name` = 'something' ";
//add order if we need it
if ($use_order)
$query .= "and `order` = 'somevalue' ";
//repeat for any other optional part
Обратите внимание, что вам, конечно же, следует принимать надлежащие меры, чтобы избежать внедрения SQL и других проблем безопасности - я не включил это здесь, чтобы упростить задачу.
Если вы используете связанные параметры, это будет невозможно.
Если вы просто замените значения, вы можете сделать следующее:
select `id` from `table` where `name` = 'something' and `order` = `order`
Я не думаю, что у вас есть выбор ... Как только вы сделаете выбор, вы не сможете "отфильтровать" и получить больше строк.
Вы должны просто использовать два запроса - либо два независимых запроса, либо один, который выбирает имя во временной таблице, а затем (необязательно) тот, который дополнительно выбирает атрибут порядка.
Это обычная тема для запросов к базе данных - вам нужен переменный запрос в зависимости от того, какую фильтрацию вы хотите применить к данным, которые он запрашивает. Вы можете пойти по пути повторения запроса в виде строки во всем коде, но это плохая практика, поскольку она без необходимости увеличивает сложность кода. Вероятность возникновения ошибок возникает, если вам по какой-либо причине необходимо изменить запрос, и в результате вам придется изменить его в нескольких местах.
Лучшее решение - создать функцию, которая строит запрос, который вы выполняете:
function buildMyQuery($name, $order = null) {
$sql = "SELECT `id` FROM `table` WHERE `name`='$name'";
if ($order != null) {
$sql .= " AND `order`='$order'";
}
return $sql;
}
Затем вы можете запустить это, просто используя поле «имя»:
$query = buildMyQuery("somename");
Или это для использования обоих полей:
$query = buildMyQuery("somename", "someorder");
Как кто-то упомянул выше, этот код намеренно упрощен и не содержит непредвиденных обстоятельств для потенциально опасных данных, передаваемых через $ name или $ order. Вам нужно будет использовать mysql_real_escape_string или что-то подобное, чтобы сначала очистить данные, в начале функции, прежде чем будет использоваться какой-либо фрагмент данных.
Генерация динамических запросов, как говорит Байрон, - это реальность, поэтому я бы привык к ней сейчас, а не прибегал к хакерским обходным путям.