выберите ... где id = любое значение. Является ли это возможным? - PullRequest
12 голосов
/ 21 мая 2010

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

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 

возможно ли это?

спасибо

Ответы [ 10 ]

12 голосов
/ 21 мая 2010

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

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

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

5 голосов
/ 21 мая 2010

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

2 голосов
/ 21 мая 2010

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

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

select `id` from `table` where `name` = 'something' and `order` = `order`
0 голосов
/ 25 мая 2018

Вы должны быть в состоянии сделать это так:

select `id` from `table` where `name` <>'' and `order` <>''

Это позволит выбрать в любом месте, что значение не равно пустому.

0 голосов
/ 25 апреля 2018
$sql = "SELECT * FROM auctions WHERE id = id ";

if ($category !== "ANY") { 
$sql .= "AND category = $category "; }

if ($subcategory !== "ANY") { 
$sql .= "AND subcategory = $subcategory "; }

if ($country !== "ANY") { 
$sql .= "AND country = $country "; }



$sql .=  "ORDER BY $order $sort LIMIT $limit OFFSET $offset";
0 голосов
/ 01 мая 2017

Не могли бы вы просто использовать not null запрос здесь?

select `id` from `table` where `name` = 'something' and `order` is not null;
0 голосов
/ 23 мая 2014

Если подумать, у меня есть лучший ответ.Мой коллега показал мне, как это можно сделать.

Мой пример ...

Select rentals.* From rentals Where ((? = '') OR (user_id = ?))

Переменные должны быть одинаковыми.

Если их обоих 5 дляНапример, первое логическое значение будет ложным, а второе будет истинным, для строк, где идентификатор пользователя равен 5.

Если вам требуется «все», установка в качестве пустой строки приведет к тому, что все строки будутвидел, чтобы соответствовать условию оговорки where.

0 голосов
/ 21 мая 2010

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

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

function buildMyQuery($name, $order = null) {
    $sql = "SELECT `id` FROM `table` WHERE `name`='$name'";

    if ($order != null) {
        $sql .= " AND `order`='$order'";
    }

    return $sql;
}

Затем вы можете запустить это, просто используя поле 'name':

$query = buildMyQuery("somename");

Или это для использования обоих полей:

$query = buildMyQuery("somename", "someorder");

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

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

0 голосов
/ 21 мая 2010

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

select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'')
0 голосов
/ 21 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...