Выборка не существующих строк. Возможно ли?

alexlednev

Новичок
Выборка не существующих строк. Возможно ли?

в таблице хранятся записи, пример:

(date) date (int) count
2007-06-19 15967
2007-06-21 13150

можно ли как нить вывести 3 (!) даты, и у даты которая отсутствует "значение" поставить 0, т.е. примерный результат работы запроса:

2007-06-19 15967
2007-06-20 0
2007-06-21 13150
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Я так понимаю средствами mysql?
Врядли.
 

Crazy

Developer
Re: Выборка не существующих строк. Возможно ли?

Автор оригинала: alexlednev
в таблице хранятся записи, пример:

(date) date (int) count
2007-06-19 15967
2007-06-21 13150

можно ли как нить вывести 3 (!) даты, и у даты которая отсутствует "значение" поставить 0, т.е. примерный результат работы запроса:

2007-06-19 15967
2007-06-20 0
2007-06-21 13150
Типовая задачка при интервьюирование ДБ-дизайнера.

1. Создавем таблицу ROLL1 с полем N типа INT. Вставляем записи 0..9.
2. Создаем декартовым произведением вьюхи ROLL2 и ROLL3, возвращающими 0..99 и 0..999. Аналогично можно сделать ROLL4 и ROLL5 если нужно.

Получим MIN('date') мы имеем базовую дату. Добавляя к дате дни из ROLL3.N (или ROLL2.N -- в зависимости от максимального диапазона дат) мы получаем последовательность из 1000 дат. Без пропусков. Именно с ней мы райтджойним нашу табличку и накладываем ограничение на максимальную дату.

Просто :) , не правда ли?
 

AmdY

Пью пиво
Команда форума
ага, у меня на роботе был такой проектировщик :(
11-таблиц и более сотни запросов для вывода 2-3 баннеров
Код:
SELECT IF(t1.date=условие,0,t2.date) FROM ...
 

Активист

Активист
Команда форума
Ну извращение, конечно.
Код:
mysql> create table test(`date` TIMESTAMP, `count` INT);
mysql> insert into `test` VALUES ('2007-06-20', '10');
mysql> insert into `test` VALUES ('2007-06-22', '20');

SELECT '2007-06-20' AS `date`, (SELECT `count` FROM `test` WHERE `test`.`date` = '2007-06-20') AS `count` UNION ALL SELECT '2007-06-21' AS `date`, (SELECT `count` FROM `test` WHERE `test`.`date` = '2007-06-21') UNION ALL SELECT '2007-06-22' AS `date`, (SELECT `count` FROM `test` WHERE `test`.`date` = '2007-06-22');

+------------+-------+
| date       | count |
+------------+-------+
| 2007-06-20 |    10 |
| 2007-06-21 |  NULL |
| 2007-06-22 |    20 |
+------------+-------+
3 rows in set (0.00 sec)
 

alexlednev

Новичок
to Crazy: Нет, на работу я не устраиваюсь : ) решение действительно существует, проверил, спасибо большое, но оно не немного неподходит под требования вышестоящей задачи. Но, все равно, спасибо!

to Активист: Пример в первом сообщении, это просто пример, конечная необходимость в выборке последовательно восьми дат с привязкой только к текущей и плясками, грубо говоря, на -8 от нее. Я понимаю, что даты в запрос можно вставлять программно, но это тоже немного не то... Спасиб.

to Fанат: Хотел как обычно сделать красиво, но не получится, скорее всего, действительно буду решать задачу средствами пхп. Спасибо.
 

Crazy

Developer
Это оно самое и есть. :)

Применяется эта хрень обычно там, где необходимо подставить выборку существующему коду. Во всяческиъ отчетах, при интеграции приложений и т.п.
 
Сверху