Utilisez plusieurs tables pour les jointures MySQL et évitez d'utiliser des méthodes de sous-requête
P粉442576165
P粉442576165 2023-09-07 17:38:48
0
2
532

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粉442576165
P粉442576165

répondre à tous(2)
P粉567281015

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粉576184933

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)
);
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal