Выберите... где 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;