Задать вопрос
@JDMeezy

Как правильно построить запрос в БД?

Есть 2 таблицы.
Объекты - Наименование объектов и прочая информация об объекте
Данные - Перечень данных, которые относятся к объектам. На каждый объект может быть по одной записи за месяц, но не исключено, что запись может и вовсе отсутствовать.

Мне нужно вывести ВСЕ объекты, и отдельный столбец, где проверялось бы, есть ли у данного объекта запись за N месяц. Можно даже без проверки, просто если есть запись, в строку что-то выводилось бы, если нет - NULL

Не могу понять каким образом построить запрос, при котором выводились бы все объекты, и в отдельном столбце при наличии записи за N месяц что-то выводилось.

БД выглядит примерно следующим образом. Параметров больше, но ограничил до минимума
64dda76804dfe236047078.png

Результат должен быть примерно следующим
64dda800ce5ac634186911.png
  • Вопрос задан
  • 139 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Akina
Сетевой и системный админ, SQL-программист.
SELECT table1.*, 
       EXISTS ( SELECT NULL
                FROM table2
                WHERE table2.table1_id = table1.id
                   AND table2.date = @needed_date
                ) AS row_exists
FROM table1

Если точная дата внутри месяца неизвестна, то
WHERE table2.date BETWEEN @needed_month_1st_day AND @needed_month_last_day
Ответ написан
Комментировать
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
select list.id, params.month == 'jun' as [есть запись за июнь] from list join params on list.id = params.id

[output]

id | есть запись за июнь
---+--------------------
 1 |                   1 # true
 2 |                   0 # false
 3 |                   1 # true
 
 
 [list]
 
 id
 --
 1
 2
 3
 
 [params]
 
 id | month
----+------
  1 | jun
  2 | jul
  3 | jun
Ответ написан
Комментировать
unfilled
@unfilled
А неважно январь какого года? В таблицах вообще не видно дат

Если не важно, то, например, так:
select *
    , case when exists (select 1 from records r where r.idObject = o.id and r.Month = 'Май') then 1 else null end as record_exists
from Objects o


Если нужен вывод не за какой-то абстрактный месяц, а выгрузка по объектам и месяцам за период, то будет примерно так (если всё-таки есть столбец с датой, можно сделать более красиво)
with months as (
    select 'Январь' as m
    union all select 'Февраль' as m
    ...
    union all select 'Декабрь' as m
)
select o.*, mo.m
    , case when exists (select 1 from records r where r.idObject = o.id and r.Month = mo.m) then 1 else null end as record_exists
from Objects o, months mo
Ответ написан
Комментировать
@nozzy
Symfony, Laravel, SQL, Python, Telegram
select 
t1.id, t1.title, t1.address, t2.month 
from Objects t1
left join records t2 on t2.idObject = t1.id 
where t2.month  = 'August'
group by t1.id, t1.title, t1.address, t2.month
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы