Rumah > Soal Jawab > teks badan
Pertanyaan saya dalam biola adalah seperti berikut.
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
Pertanyaan berfungsi seperti yang diharapkan. Tetapi, adakah terdapat sebarang masalah prestasi dengan pertanyaan itu. Adakah mungkin untuk menukar pertanyaan dalaman untuk menyertai?
P粉5672810152023-09-08 16:30:03
Subkueri anda tidak bergantung pada subkueri, tetapi bebas. Iaitu, mereka tidak merujuk lajur dalam jadual notification
anda, hanya lajur dalam jadual mereka sendiri.
Jadi tiada masalah prestasi di sini.
P粉5761849332023-09-08 15:26:05
Anda boleh menyatakan subkueri sebagai pertanyaan kesatuan dan membandingkan statistik rancangan pelaksanaan. Melihat pada output dalam fiddle, union nampaknya berprestasi lebih baik sedikit.
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 ) );
Cara lain untuk menyatakannya ialah menggunakan wujud
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) );