Gunakan berbilang jadual untuk gabungan MySQL dan elakkan menggunakan kaedah subquery
P粉442576165
P粉442576165 2023-09-07 17:38:48
0
2
481

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

membalas semua(2)
P粉567281015

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

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)
);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan