Выберите... где id = любое значение. Является ли это возможным?
посмотрите на эту таблицу, пожалуйста,
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
Возможно ли это?
спасибо
Ответы
Ответ 1
Ну, это вроде хак, но если вам действительно нужно это сделать, он будет работать следующим образом:
select `id` from `table` where `name` = 'something' and `order` = `order`
Тогда вы просто говорите "везде, где порядок такой же, как и сам", поэтому он всегда прав.
Ответ 2
Нет, это невозможно. Вам нужно изменить структуру (возможно, для 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 и других проблем безопасности. Я не включил это здесь, чтобы все было просто.
Ответ 3
Если вы используете связанные параметры, это было бы невозможно.
Если вы просто подставляете значения, вы можете сделать следующее:
select `id` from `table` where `name` = 'something' and `order` = `order`
Ответ 4
Я не думаю, что у вас есть выбор... Когда вы сделаете выбор, вы не сможете "отфильтровать" и получить больше строк.
Вы должны просто использовать два запроса: либо два независимых запроса, либо один, который выбирает имя в таблице temp, а затем (необязательно) тот, который дополнительно выбирает атрибут order.
Ответ 5
Как сказал Чад выше, просто установите столбец равным самому себе. Но будьте осторожны, на некоторых платформах/установках конфигурации, NULL!= NULL:
select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'')
Ответ 6
Это обычная тема с запросами базы данных - вам нужен переменный запрос в зависимости от того, сколько фильтров вы хотите применить к запросам данных. Вы можете пойти по пути повторения запроса в виде строки во всем своем коде, но это плохая практика, так как это увеличивает сложность кода без необходимости. Вероятность возникновения ошибок возникает, если вам необходимо по каким-либо причинам изменить запрос и изменить его в нескольких местах.
Лучшим решением является создание функции, которая строит запрос для вас:
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 или что-то похожее на очистку данных во-первых, в начале функции перед использованием любой части данных.
Динамическое создание запросов - это факт жизни, о котором говорит Байрон, поэтому я привык к нему сейчас, вместо того, чтобы использовать обходные пути hack-ish.
Ответ 7
При отражении у меня есть лучший ответ. Мой коллега показал мне, как это можно сделать.
Мой пример...
Select rentals.* From rentals Where ((? = '') OR (user_id = ?))
Переменные должны быть одинаковыми.
Если они оба равны 5, то первое логическое значение будет ложным, а второе будет истинным, для строк, где идентификатор пользователя равен 5.
Если вам требуется "все", установка в качестве пустой строки приведет к тому, что все строки будут видны в соответствии с условием условия where.
Ответ 8
Не можете ли вы просто использовать запрос not null
здесь?
select `id` from `table` where `name` = 'something' and `order` is not null;