cari

Rumah  >  Soal Jawab  >  teks badan

Gunakan berbilang jadual untuk gabungan MySQL dan elakkan menggunakan kaedah subquery

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粉442576165P粉442576165452 hari yang lalu484

membalas semua(2)saya akan balas

  • P粉567281015

    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.

    balas
    0
  • P粉576184933

    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)
    );

    balas
    0
  • Batalbalas