Я хочу, чтобы все активные пользователи создавали или обновляли сообщения и/или статьи
user(id,...)
post(id, created_by_id, updated_by_id, ...)
article(id, created_by_id, updated_by_id, ...)
Я думаю, что нашел запрос SQL, который работает:
select u.id, u.firstname, u.lastname
from user u, article a, post p
where u.is_active = true and (u.id = a.created_by_id or u.id = p.created_by_id or u.id = a.updated_by_id or u.id = p.updated_by_id)
group by u.id
Можно ли добавить виртуальное поле, в котором будет указано, активен ли пользователь, или он создал или обновил контент (статью или пост)? Как это:
id - firstname - lastname - status
1 - John - Doe - active
2 - Bob - One - has content
3 - Alice - Twotwo - has content
4 - Luke - Sky - active
и какой будет просьба об этом?
Это возможно с указанием случая.
SELECT u.id, u.firstname, u.lastname,
CASE WHEN a.created_by_id is null && a.updated_by_id is null && p.created_by_id is null && p.updated_by_id is null THEN 'active'
ELSE 'has content'
END as 'status'
FROM User u
LEFT JOIN post p ON u.id = p.created_by_id OR u.id = p.updated_by_id
LEFT JOIN article a ON u.id = a.created_by_id OR u.id = a.updated_by_id
WHERE u.is_active = 1
ORDER BY u.id
Вы можете попробовать использовать case when
expression, а также лучше использовать явное соединение, а не соединение через запятую
select u.id, u.firstname, u.lastname,
case when u.is_active = true then 'active' else 'has content' end as 'status'
from user u inner join article a on u.id = a.created_by_id or u.id = a.updated_by_id
inner join post p on u.id = p.created_by_id or u.id = p.updated_by_id
where u.is_active = true
Вы должны объединить таблицы и использовать CASE для создания нового столбца:
select u.id, u.firstname, u.lastname,
case
when (a.created_by_id is not null) or (p.created_by_id is not null) then 'has content'
else 'active'
end status
from user u left join article a
on u.id=a.created_by_id or u.id=a.updated_by_id
left join post p on u.id=p.created_by_id or u.id=p.updated_by_id
where u.is_active = true
Вы можете использовать соединение явно, не разделенные комой объединение и использование объединения
select u.id, u.firstname, u.lastname
from user u join
article a on u.id=a.created_by_id or u.id=a.updated_by_id
where u.is_active = true
union
select u.id, u.firstname, u.lastname
from user u
join post p on u.id=p.created_by_id or u.id=p.updated_by_id
where u.is_active = true
JOIN
. Легче писать (без ошибок), легче читать и обслуживать, и при необходимости легче конвертировать во внешнее соединение!status
.