0
votes

utilisateur qui sont actifs et ont des postes ou des articles

Je souhaite obtenir tout utilisateur actif créé ou mis à jour des messages ou / et des articles xxx

Je pense avoir trouvé une demande SQL qui fonctionne: xxx < / Pré>

est-il possible d'ajouter un champ virtuel indiquant si l'utilisateur est juste actif ou s'il crée ou mis à jour le contenu (article ou post)? Comme ça: xxx

et quelle serait la demande de cela?


7 commentaires

Conseil d'aujourd'hui: utilisez toujours la syntaxe joindre . Plus facile à écrire (sans erreur), plus facile à lire et à entretenir, et plus facile à convertir en jointure extérieure si nécessaire!


Ajoutez des échantillons de données et de la logique, comment vous détermineriez le statut .


Si vous voulez un champ virtuel, vous pouvez créer une vue où le champ d'état est défini avec votre demande dev.mysql.com/doc/refman/8.0/fr/views.html


@Cyril f La réponse que vous avez acceptée vous donnera contient pour les utilisateurs qui n'ont rien créé mais ont mis à jour quelque chose. Ce n'est pas ce que vous avez demandé.


@ forpas vérifie ma question, j'ai demandé une requête qui me donne des utilisateurs créés ou mis à jour du contenu


ou s'il crée le contenu (article ou post) Est-ce que je manque quelque chose?


mon mauvais j'ai dit mis à jour en haut de la question et ensuite créé uniquement


4 Réponses :


1
votes

Vous pouvez utiliser Joindre explicitement non pas de virgule séparée et utilisez Union

 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  


2 commentaires

Cela ne fonctionne pas comme prévu car il tire tous les utilisateurs même s'ils n'ont pas de contenu.


De cette façon, cela ne tire que les utilisateurs avec des articles ou avec des articles et des articles, mais pas les utilisateurs avec des messages et aucun article.



1
votes

Vous devez rejoindre les tables et utiliser le cas pour créer la nouvelle colonne:

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 commentaires

1
votes

Vous pouvez essayer d'utiliser lorsque CODE> Expression et il est également préférable d'utiliser une jointure explicite plutôt que des jointures séparées par des virgules

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 commentaires

1
votes

Ceci est possible avec la déclaration de cas.

 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 commentaires