Je souhaite obtenir tout utilisateur actif créé ou mis à jour des messages ou / et des articles Je pense avoir trouvé une demande SQL qui fonctionne: p> 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: p> et quelle serait la demande de cela? P> p>
4 Réponses :
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
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.
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
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
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
Conseil d'aujourd'hui: utilisez toujours la syntaxe code> joindre code> code>. 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
code>.Si vous voulez un champ virtuel, vous pouvez créer une vue code> code> 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 code> 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) i> Est-ce que je manque quelque chose?
mon mauvais j'ai dit mis à jour en haut de la question et ensuite créé uniquement