выберите … где идентификатор = любое значение. действительно ли это возможно?

посмотрите на эту таблицу

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 

действительно ли это возможно?

спасибо

12
задан Simon 23 January 2012 в 16:21
поделиться

6 ответов

Ну, это своего рода хак, но если вам действительно нужно это сделать, это будет работать так:

select `id` from `table` where `name` = 'something' and `order` = `order`

Тогда вы просто говорите "везде, где порядок совпадает с самим собой", так что это всегда верно.

12
ответ дан 2 December 2019 в 19:30
поделиться

Как Чад сказал выше, просто установите столбец равным самому себе. Но будьте осторожны, на некоторых платформах / конфигурациях установки NULL! = NULL:

select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'')
0
ответ дан 2 December 2019 в 19:30
поделиться

Нет, это невозможно. Вам нужно изменить структуру (необязательно на 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 и других проблем безопасности - я не включил это здесь, чтобы упростить задачу.

5
ответ дан 2 December 2019 в 19:30
поделиться

Если вы используете связанные параметры, это будет невозможно.

Если вы просто замените значения, вы можете сделать следующее:

select `id` from `table` where `name` = 'something' and `order` = `order`
2
ответ дан 2 December 2019 в 19:30
поделиться

Я не думаю, что у вас есть выбор ... Как только вы сделаете выбор, вы не сможете "отфильтровать" и получить больше строк.

Вы должны просто использовать два запроса - либо два независимых запроса, либо один, который выбирает имя во временной таблице, а затем (необязательно) тот, который дополнительно выбирает атрибут порядка.

0
ответ дан 2 December 2019 в 19:30
поделиться

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

Лучшее решение - создать функцию, которая строит запрос, который вы выполняете:

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 или что-то подобное, чтобы сначала очистить данные, в начале функции, прежде чем будет использоваться какой-либо фрагмент данных.

Генерация динамических запросов, как говорит Байрон, - это реальность, поэтому я бы привык к ней сейчас, а не прибегал к хакерским обходным путям.

0
ответ дан 2 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: