Пользователь, который активен и имеет сообщения или статьи

0

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

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

и какой будет просьба об этом?

  • 3
    Совет на сегодня: всегда используйте современный, явный синтаксис JOIN . Легче писать (без ошибок), легче читать и обслуживать, и при необходимости легче конвертировать во внешнее соединение!
  • 0
    Добавьте пример данных и логику, как вы будете определять status .
Показать ещё 5 комментариев
Теги:

4 ответа

1
Лучший ответ

Это возможно с указанием случая.

 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
1

Вы можете попробовать использовать 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 
1

Вы должны объединить таблицы и использовать 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
1

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

 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  
  • 0
    Это не работает, как ожидалось, так как тянет всех пользователей, даже если у них нет контента.
  • 0
    таким образом, это тянет только пользователей со статьями или со статьями и постами, но не пользователей с постами и без статьи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню