Maison > Questions et réponses > le corps du texte
Ma requête en violon est la suivante.
select * from notification where status = 0 and ( notif_id in (select notif_id from notif_user where user_id = 1) OR notif_id in (select notif_id from notif_group where group_id = 1))
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=cad284e77218eb37461e60b6308bf85f
Les requêtes fonctionnent comme prévu. Mais y aura-t-il des problèmes de performances avec la requête. Est-il possible de convertir une requête interne en jointure ?
P粉5672810152023-09-08 16:30:03
Votre sous-requête n'est pas dépendante d'une sous-requête, mais indépendante. Autrement dit, ils ne font pas référence aux colonnes de votre table notification
, mais uniquement aux colonnes de leur propre table.
Donc, pas de problèmes de performances ici.
P粉5761849332023-09-08 15:26:05
Vous pouvez exprimer les sous-requêtes sous forme de requêtes syndicales et comparer les statistiques du plan d'exécution. En regardant le résultat dans fiddle, union semble fonctionner légèrement mieux.
select * from notification where status = 0 and ( notif_id in ( select notif_id from notif_user where user_id = 1 union all select notif_id from notif_group where group_id = 1 ) );
Une autre façon de l'exprimer est d'utiliser existe
select * from notification n where status = 0 and ( exists (select * from notif_user nu where nu.user_id = 1 and nu.notif_id = n.notif_id) or exists(select * from notif_group ng where ng.group_id = 1 and ng.notif_id = n.notif_id) );