Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bergabunglah dengan beberapa tabel, pertahankan NULL

Saat Anda menggunakan gabungan luar, dan kemudian menggunakan salah satu kolom "luar" dalam pemeriksaan kesetaraan di WHERE klausa, Anda mengubah gabungan luar Anda menjadi gabungan dalam. Ini karena kondisi Anda yang memeriksa privasi kiriman mengharuskan kiriman tersebut ada di sana:

AND p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1)

Ketika gabungan luar akan menghasilkan baris yang sesuai dengan pemberitahuan tanpa pos, itu akan memeriksa kondisi di atas. Karena pos tidak ada di sana, p.privacy akan mengevaluasi ke NULL , "mencemari" kedua sisi OR , dan akhirnya membuat seluruh kondisi dievaluasi menjadi false .

Pindahkan kondisi ini ke ON kondisi bergabung akan memperbaiki masalah:

SELECT
  u.username AS sender,
  ux.username AS receiver,
  p.id
FROM notifications n
JOIN follows f ON (n.user_id = f.tofollow_id)
JOIN follows fr ON (n.tonotify_id = fr.tofollow_id)
JOIN user u ON (u.id = n.user_id)
JOIN user ux ON (ux.id = n.tonotify_id)
LEFT JOIN posts p ON (n.posts_id = p.id)
                 AND (p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1))
WHERE f.user_id = 1
  AND fr.user_id = 1
  AND f.status = 1
ORDER BY n.id DESC

Cara lain untuk memperbaikinya adalah dengan menambahkan IS NULL kondisi ke OR . Anda , seperti ini:

SELECT
  u.username AS sender,
  ux.username AS receiver,
  p.id
FROM notifications n
JOIN follows f ON (n.user_id = f.tofollow_id)
JOIN follows fr ON (n.tonotify_id = fr.tofollow_id)
JOIN user u ON (u.id = n.user_id)
JOIN user ux ON (ux.id = n.tonotify_id)
LEFT JOIN posts p ON (n.posts_id = p.id)
WHERE f.user_id = 1
  AND fr.user_id = 1
  AND f.status = 1
  AND (p.privacy IS NULL OR p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1))
ORDER BY n.id DESC


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php+mysql:masukkan array php ke mysql

  2. Cara Menghitung Margin Di MySQL

  3. Membandingkan string dengan yang satu memiliki ruang kosong sebelumnya sementara yang lain tidak

  4. MySQL BERGABUNG vs MENGGUNAKAN?

  5. SQLSTATE[22007]:Format waktu-tanggal tidak valid:1292 Nilai waktu-tanggal salah:'2019-03-31 01:52:25'