Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MySQL запрос с двумя наборами параметров

18K
03 июня 2012 года
imAlex
179 / / 29.07.2010
Добрый день.
Столкнулся тут с такой проблемой. Необходимо написать запрос к базе с двумя наборами параметров WHERE.
Есть одна таблица с полями:
ID ; Number ; US_ID ; ST
Запрос должен выдать максимальное значение столбца Number при US_ID=3 AND ST=1 если таково существует, иначе максимальное значение Number+1

Я пробовал разные комбинации в стиле:

 
Код:
SELECT
    IF
    (
        MAX(NUMBER) IS NULL,
        (SELECT MAX(NUMBER)+1 FROM `table`),
         MAX(NUMBER)
    )
    FROM `table` WHERE  `US_ID`='3' AND `ST`='1'
Естественно не сработало. Подскажите, как правильно сформировать запрос такого плана?
385
04 июня 2012 года
SomewherSomehow
477 / / 25.07.2004
Для второго случая, пришел в голову еще один способ, без подзапроса. На mssql - работает, не знаю, схавает ли мускуль. Хотя по идее должен, все операторы ансишные вроде, кроме ifnull. Короче, можно попробовать.
 
Код:
SELECT
    ifnull(
        max(case when `US_ID`='3' AND `ST`='1' then NUMBER else null end),
        ifnull(max(NUMBER),0)+1
    ) as maxnumber
FROM
     `table`
Какой запрос выгоднее, зависит от ваших данных и индексов.
385
04 июня 2012 года
SomewherSomehow
477 / / 25.07.2004
Я думаю, проблема в том, что null+что_угодно дает null.
Я так понимаю, у вас задача найти максимальный, а если такового нет, то использовать единицу. Попробуйте просто:
 
Код:
SELECT IFNULL(MAX(NUMBER),1) as maxnumber FROM `table` WHERE  `US_ID`='3' AND `ST`='1'
Если вы имели ввиду что в случае если не найдено, и требуется number+1, где number это максимальный номер среди вообще всей таблицы, то можно подзапросом
 
Код:
SELECT
    IFNULL(
        MAX(NUMBER),
        (SELECT IFNULL(MAX(NUMBER),0)+1 FROM `table`)
    )  as maxnumber
FROM
    `table`
WHERE  
    `US_ID`='3' AND
    `ST`='1'
18K
08 июня 2012 года
imAlex
179 / / 29.07.2010
Огромное спасибо за ответ.
Второй вариант это именно то, что мне было необходимо. Я пытался вывести сам нечто подобное, к сожалению не хватило знаний.
Моя ошибка была в том, что я пытался часть "ifnull(max(NUMBER),0)+1" описать с помощью конструкции кейсов и видимо совсем запутался.
Кстати не встречал в мануалах конструкции вида
 
Код:
SELECT (CASE WHEN... ) FROM ...
и думал, что ошибка у меня именно здесь.
Вариант предложенный мною изначально работает, но при условии, что в таблице уже есть записи.
Ваш последний вариант работает и при отсутствии записи
385
10 июня 2012 года
SomewherSomehow
477 / / 25.07.2004
Кстати, если на вопрос ответили, тут теперь есть опция, отметить как ответ...какбэ намекаю...=)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог