Saat menggunakan hubungan banyak ke banyak, satu-satunya cara realistis untuk menangani ini adalah dengan tabel pemetaan.
Katakanlah kita memiliki sekolah dengan guru dan siswa, seorang siswa dapat memiliki banyak guru dan sebaliknya.
Jadi kita buat 3 tabel
student
id unsigned integer auto_increment primary key
name varchar
teacher
id unsigned integer auto_increment primary key
name varchar
link_st
student_id integer not null
teacher_id integer not null
primary key (student_id, teacher_id)
Tabel siswa akan memiliki 1000 record
Tabel guru akan memiliki 20 record
Tabel link_st akan memiliki record sebanyak link (BUKAN 20x1000, tetapi hanya untuk link yang sebenarnya).
Pilihan
Anda memilih mis. siswa per guru menggunakan:
SELECT s.name, t.name
FROM student
INNER JOIN link_st l ON (l.student_id = s.id) <--- first link student to the link-table
INNER JOIN teacher t ON (l.teacher_id = t.id) <--- then link teacher to the link table.
ORDER BY t.id, s.id
Biasanya Anda harus selalu menggunakan inner join
di sini.
Membuat tautan
Saat Anda menugaskan seorang guru kepada seorang siswa (atau sebaliknya, itu sama saja) .Anda hanya perlu melakukan:
INSERT INTO link_st (student_id, teacher_id)
SELECT s.id, t.id
FROM student s
INNER JOIN teacher t ON (t.name = 'Jones')
WHERE s.name = 'kiddo'
Ini sedikit penyalahgunaan dari inner join, tapi ini bisa dilakukan selama namanya unik.
Jika Anda tahu id-nya, Anda bisa langsung memasukkannya saja.
Jika namanya adalah tidak unik ini akan menjadi gagal dan sebaiknya tidak digunakan.
Cara menghindari tautan duplikat
Sangat penting untuk menghindari tautan duplikat, segala macam hal buruk akan terjadi jika Anda memilikinya.
Jika Anda ingin mencegah penyisipan tautan duplikat ke tabel tautan, Anda dapat mendeklarasikan unique
indeks pada tautan (disarankan)
ALTER TABLE link_st
ADD UNIQUE INDEX s_t (student_id, teacher_id);
Atau Anda dapat melakukan pemeriksaan di pernyataan sisipan (tidak terlalu disarankan, tetapi berhasil).
INSERT INTO link_st (student_id, teacher_id)
SELECT s.id, t.id
FROM student s
INNER JOIN teacher t ON (t.id = 548)
LEFT JOIN link_st l ON (l.student_id = s.id AND l.teacher_id = t.id)
WHERE (s.id = 785) AND (l.id IS NULL)
Ini hanya akan memilih 548, 785 jika bahwa data belum ada di link_st
tabel, dan tidak akan mengembalikan apa pun jika data itu sudah ada di link_st. Jadi itu akan menolak untuk memasukkan nilai duplikat.
Jika Anda memiliki sekolah meja, itu tergantung apakah seorang siswa dapat terdaftar di beberapa sekolah (tidak mungkin, tetapi mari kita asumsikan) dan guru dapat terdaftar di beberapa sekolah. Sangat mungkin.
table school
id unsigned integer auto_increment primary key
name varchar
table school_members
id id unsigned integer auto_increment primary key
school_id integer not null
member_id integer not null
is_student boolean not null
Anda dapat membuat daftar semua siswa di sekolah seperti ini:
SELECT s.name
FROM school i
INNER JOIN school_members m ON (i.id = m.school_id)
INNER JOIN student s ON (s.id = m.member_id AND m.is_student = true)