Пользователь, который активен и имеет сообщения или статьи - PullRequest
0 голосов
/ 30 января 2019

Я хочу получить всех активных пользователей, которые создали или обновили сообщения и / или статьи

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

и какой будет запрос на это?

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Это возможно с помощью оператора case.

 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
0 голосов
/ 30 января 2019

Вы должны объединить таблицы и использовать 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
0 голосов
/ 30 января 2019

Вы можете попробовать использовать выражение case when, а также лучше использовать явное соединение, а не соединение через запятую

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 
0 голосов
/ 30 января 2019

Вы можете использовать соединение явно, не разделенное запятыми соединение и использовать объединение

 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...