Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2019, 02:16   #1
dbalor
Форумчанин
 
Аватар для dbalor
 
Регистрация: 06.09.2016
Сообщений: 198
По умолчанию Вывод пустых записей в запросе

есть справочник тем,

в другой таблице хранится информация по темам разбитая по датам, на каждую дату.

Во второй таблице поле внешнего ключа на справочник тем.

В запросе нужно вывести на каждую дату все четыре темы, если такой темы на дату нет - вывести пустую строку:

дата1 тема1
дата1 тема2
дата1 null
дата1 null
дата2 null
дата2 тема2
дата2 тема3
дата2 тема4
dbalor вне форума Ответить с цитированием
Старый 31.05.2019, 06:19   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Обычный left join такое сделает

Хмм.. А как отличить
Код:
дата2 null
дата2 тема2
дата2 тема3
дата2 тема4
от
Код:
дата2 тема1
дата2 тема2
дата2 тема3
дата2 null
?

Последний раз редактировалось Black Fregat; 31.05.2019 в 06:22.
Black Fregat вне форума Ответить с цитированием
Старый 31.05.2019, 06:34   #3
dbalor
Форумчанин
 
Аватар для dbalor
 
Регистрация: 06.09.2016
Сообщений: 198
По умолчанию

Это выборка из двух таблиц(темы это справочник а где дата это таблица)

на дату 2 нет темы4(т.е. на данную дату в таблице есть темы 1-3):
дата2 тема1
дата2 тема2
дата2 тема3
дата2 null

Цитата:
Обычный left join такое сделает
Дело в том что во таблице есть все темы, но мне нужно выводить на каждую дату по 4 строки(столько в справочнике) - на каждую дату в таблице от 0 до 4 тем( см.справочник ).

Если на данную дату 0 тем(нет записей на данную дату в таблице) выводим:
дата2 null
дата2 null
дата2 null
дата2 null
dbalor вне форума Ответить с цитированием
Старый 31.05.2019, 07:53   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
select D.Дата,S2.Name,S1.sprid
  from Темы S1,Даты D LEFT JOIN Темы S2 ON S2.sprid=D.sprid
  ORDER BY D.Дата,S1.sprid
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.05.2019, 08:22   #5
dbalor
Форумчанин
 
Аватар для dbalor
 
Регистрация: 06.09.2016
Сообщений: 198
По умолчанию

Аватар, пробовал никаких пустых полей не выводит
dbalor вне форума Ответить с цитированием
Старый 31.05.2019, 08:55   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Запрос покажи как пробовал. Ну и в том запросе что дал не так все просто, там по датам еще сгруппировать нужно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.05.2019 в 09:18.
Аватар вне форума Ответить с цитированием
Старый 31.05.2019, 09:35   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Аватар, пробовал никаких пустых полей не выводит
ON S2.sprid=D.sprid
Цитата:
Ну и в том запросе что дал не так все просто, там по датам еще сгруппировать нужно
Код:
select D.Дата,S2.Name,S1.sprid
from Темы S1,Даты D (select distinct data from d ) as D
LEFT JOIN Темы S2 ON S2.sprid=D.sprid S2.data=D.data and S2.tema=S1.tema
ORDER BY D.Дата,S2.sprid S1.tema
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 31.05.2019, 09:39   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ага, ток еще один join добавить, нет даты в справочнике тем
Код:
SELECT D1.Дата,S2.Name,S1.SprId
  FROM Темы S1 CROSS JOIN (SELECT Дата FROM Даты GROUP BY Дата) D1
    LEFT JOIN Даты D2 ON D2.Дата=D1.Дата AND D2.SprId=S1.SprId
    LEFT JOIN Темы S2 ON S2.SprId=D2.SprId
  ORDER BY D1.Дата,S1.SprId
или так

Код:
SELECT D1.Дата,CASE WHEN D2.SprId IS NULL THEN NULL ELSE S1.Name END AS Name,S1.SprId
  FROM Темы S1 CROSS JOIN (SELECT Дата FROM Даты GROUP BY Дата) D1
    LEFT JOIN Даты D2 ON D2.Дата=D1.Дата AND D2.SprId=S1.SprId
  ORDER BY D1.Дата,S1.SprId
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.05.2019 в 09:43.
Аватар вне форума Ответить с цитированием
Старый 06.06.2019, 16:20   #9
dbalor
Форумчанин
 
Аватар для dbalor
 
Регистрация: 06.09.2016
Сообщений: 198
По умолчанию

Спасибо, задачу решил с помощью примера Аватара
dbalor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MySQL - разная политика при добавлении записей для неуказанных в запросе NOT NULL полей Serge_Bliznykov SQL, базы данных 6 03.03.2015 23:38
Вывод пустых ячеек вместо 0000-00-00 bizarre86 PHP 5 15.04.2013 06:29
Подсчёт количества записей в запросе satka Microsoft Office Access 4 01.09.2011 21:45
поиск пустых ячеек и вывод результата alexander_l Microsoft Office Excel 7 17.06.2010 16:50