в один запрос с ветвлением

ambasador
Дата: 21.01.2013 21:52:03
Всех приветствую на форуме!
Возможно ли осуществить сабж с задачей такого вида:
date:
21.01
22.01
23.01
24.01
00.00
00.00
00.00

нужно вытянуть элементы по условию, берется максимальный элемент(24.01) затем сравнивается с текущей датой на сервере, и если они равны взять все существующие элементы, в противном случае взять все 00.00.
можно ли сделать это не прибегая к помощи хранимых процедур.
Akina
Дата: 21.01.2013 21:59:32
Да легко... схематично, скажем, так:

where case when (select max(date) from table)=today then date<>00.00 else date=00.00 end
ambasador
Дата: 21.01.2013 22:09:19
Akina,
Сенкью вери мач за код, надо бы еще переварить это!
DBConstructor
Дата: 22.01.2013 03:53:46
ambasador,

SET @max_date := (SELECT Max(t.date) FROM mytable t);
SET @cond := (Date(Now()) = Date(@max_date));
SELECT *
  FROM mytable t
  WHERE CASE
    WHEN @cond THEN t.date <> 0
    ELSE t.date = 0
    END;
ambasador
Дата: 22.01.2013 08:27:36
DBConstructor, Akina,
Вот спасибо, помогли, честно говоря не думал что мне ответят с сегодняшней(вчерашней) регой.
ambasador
Дата: 22.01.2013 10:40:37
Подскажите еще в чем грабли:

update post set date = now()
where case
when (date(now()) = date((select max(t.date) from post t))) then t.date is not null
else t.date is null
end;


выдает ошибку:
ER_BAD_FIELD_ERROR (1054) - Unknown column 't.date' in 'where clause'
ambasador
Дата: 22.01.2013 10:44:38
Подозреваю что после post поставить t надо
update post t set date = now()
where case
when (date(now()) = date((select max(t.date) from post t))) then t.date is not null
else t.date is null
end;

но в этом случае ошибка:
ER_UPDATE_TABLE_USED (1093) - You can't specify target table 't' for update in FROM clause
DBConstructor
Дата: 22.01.2013 15:52:49
ambasador, учи матчасть! )

SET @max_date := (SELECT Max(date) FROM post);
SET @cond := (Date(Now()) = Date(@max_date));
UPDATE post p SET p.date = Now()
  WHERE CASE
    WHEN @cond THEN NOT p.date IS NULL
    ELSE p.date IS NULL
    END;


Нет такого условия NOT NULL. Таким бывает только определитель поля в структуре таблицы. Условие бывает IS NULL и соответственно, с отрицанием NOT IS NULL
ambasador
Дата: 22.01.2013 16:18:23
DBConstructor,
ясно, но почему тогда не генерируется ошибка при date is not null?, а по последнему моему вопросу нашел решение, только нифига не понял:
update post set date = now() where date in(select * from(select date from post where not date is null) as t);

это совместное использование апдейт и селект в одном запросе, как то можно через джоин, не нашел пока.
AlexeyVD
Дата: 22.01.2013 16:21:18
DBConstructor
Нет такого условия NOT NULL. Таким бывает только определитель поля в структуре таблицы. Условие бывает IS NULL и соответственно, с отрицанием NOT IS NULL

Может это вам матчасть почитать? IS NOT NULL
А то научите сейчас человек откровенному бреду.