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

Derajat Kueri Pemisahan

Berikut ini cara melakukan pencarian menggunakan pencarian jalur terpendek pertama, menggunakan GABUNG. Tidak ada keajaiban dalam algoritme ini, karena kami menggunakan MySQL untuk menemukan jawaban kami, dan kami tidak menggabungkan algoritme penelusuran mewah apa pun yang menggunakan heuristik atau pengoptimalan apa pun.

Tabel 'teman' saya memiliki hubungan searah, jadi kami memiliki duplikat dalam arti bahwa '1 ke 2' dan '2 ke 1' disimpan. Saya juga mengecualikan is_active karena implementasinya akan jelas:

Berikut datanya:

member_id   friend_id
1           2
1           3
1           4
2           1
2           3
2           5
2           6
3           2
3           1
4           1
5           2
6           2
6           7
7           6
7           8
8           7

Kami memiliki anggota 1 yang dipilih, dan kami bertanya apakah 1 teman dengan 7, teman dari teman, dll? Hitungan 0 berarti tidak, dan hitungan 1 berarti ya.

SELECT COUNT(*)
FROM friends f1
WHERE f1.member_id = 1
  AND f1.friend_id = 7

Jika tidak, apakah mereka teman dari teman?

SELECT COUNT(*)
FROM friends f1
JOIN friends f2
  ON f2.member_id = f1.friend_id
WHERE f1.member_id = 1
  AND f2.friend_id = 7

Jika tidak, lalu teman dari teman dari teman?

SELECT COUNT(*)
FROM friends f1
JOIN friends f2
  ON f2.member_id = f1.friend_id
JOIN friends f3
  ON f3.member_id = f2.friend_id
WHERE f1.member_id = 1
  AND f3.friend_id = 7

Dan seterusnya...

Kueri ketiga akan menemukan jalur '1 hingga 2', '2 hingga 6', dan '6 hingga 7', mengembalikan hitungan 1.

Setiap kueri menjadi lebih mahal (karena jumlah gabungan yang lebih besar), jadi Anda mungkin ingin membatasi pencarian di beberapa titik. Satu hal yang keren adalah bahwa pencarian ini bekerja dari kedua ujung ke tengah, yang merupakan salah satu pengoptimalan sederhana yang disarankan untuk pencarian jalur terpendek.

Berikut cara menemukan rekomendasi teman bersama untuk anggota 1:

SELECT f2.friend_id
FROM friends f1
JOIN friends f2
  ON f2.member_id = f1.friend_id
LEFT JOIN friends f3
  ON f3.member_id = f1.member_id
  AND f3.friend_id = f2.friend_id
WHERE f1.member_id = 1
  AND f2.friend_id <> f1.member_id // Not ourself
  AND f3.friend_id IS NULL // Not already a friend


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menginstal dan mengkonfigurasi mysql 5.6.16 di windows 7

  2. Bagaimana cara memilih baris yang memiliki stempel waktu hari ini?

  3. Bagaimana cara mengubah kueri MSSQL CTE ke MySQL?

  4. virtualenv, mysql-python, pip:ada yang tahu caranya?

  5. Hapus dari satu tabel dengan bergabung