Menggabungkan tiga tabel menggunakan MySQL

117

Saya memiliki tiga tabel bernama

**Student Table**
-------------
id    name
-------------
1     ali
2     ahmed
3     john
4     king

**Course Table**
-------------
id    name
-------------
1     physic
2     maths
3     computer
4     chemistry

**Bridge**
-------------
sid    cid
-------------
1     1
1     2
1     3
1     4
2     1
2     2
3     3
3     4
4     1
4     2

Sekarang untuk menunjukkan nama siswa dengan nama mata kuliah yang dia pelajari seperti,

**Result**
---------------------------
Student        Course
---------------------------
ahmed         physic
ahmed         maths
ahmed         computer
ahmed         chemistry
ali           physic
ali           maths
john          computer
john          chemistry
king          physic
king          maths

Saya membangun kueri berikut

select s.name as Student, c.name as Course from student s, course c join bridge b on c.id = b.cid order by s.name

Tapi itu tidak mengembalikan hasil yang dibutuhkan ...

Dan apa jadinya untuk bentuk yang dinormalisasi, jika saya ingin menemukan siapa manajer dari yang lain:

**employee**
-------------------
id        name
-------------------
1         ali
2         king
3         mak
4         sam
5         jon

**manage**
--------------
mid      eid
--------------
1         2
1         3
3         4
4         5

Dan ingin mendapatkan hasil ini:

**result**
--------------------
Manager      Staff
--------------------
ali          king
ali          mak
mak          sam
sam          jon
PHP Ferrari
sumber
pada hasil pertama Anda salah mengatur data untuk ahmed dan ali
NineCattoRules

Jawaban:

199

Gunakan sintaks ANSI dan akan jauh lebih jelas bagaimana Anda menggabungkan tabel:

SELECT s.name as Student, c.name as Course 
FROM student s
    INNER JOIN bridge b ON s.id = b.sid
    INNER JOIN course c ON b.cid  = c.id 
ORDER BY s.name 
RedFilter
sumber
9
@Muhammad: Jawaban kami sama, hanya berbeda dalam sintaks. Jika Anda tidak mengetahui ANSIsintaks, ada baiknya Anda meluangkan waktu untuk mempelajarinya. Ini akan membantu Anda menghindari JOINkesalahan seperti yang Anda buat di masa mendatang.
RedFilter
16

Untuk menormalkan bentuk

select e1.name as 'Manager', e2.name as 'Staff'
from employee e1 
left join manage m on m.mid = e1.id
left join employee e2 on m.eid = e2.id
PHP Ferrari
sumber
Apakah urutan penting dalam m.mid = e1.iddan m.eid = e2.id?
Pathros
1
@Pathros Tidak, urutan tidak menjadi masalah, dalam ekspresi tersebut.
ToolmakerSteve
4
SELECT *
FROM user u
JOIN user_clockits uc ON u.user_id=uc.user_id
JOIN clockits cl ON cl.clockits_id=uc.clockits_id
WHERE user_id = 158
Ali Umair
sumber
Jawaban ini terlihat sangat mirip dengan jawaban yang sudah diberikan 5 tahun sebelumnya. Bagaimana dengan jawaban Anda yang menurut Anda penting, dan hilang dari jawaban yang ada?
ToolmakerSteve
1
SELECT 
employees.id, 
CONCAT(employees.f_name," ",employees.l_name) AS   'Full Name', genders.gender_name AS 'Sex', 
depts.dept_name AS 'Team Name', 
pay_grades.pay_grade_name AS 'Band', 
designations.designation_name AS 'Role' 
FROM employees 
LEFT JOIN genders ON employees.gender_id = genders.id 
LEFT JOIN depts ON employees.dept_id = depts.id 
LEFT JOIN pay_grades ON employees.pay_grade_id = pay_grades.id 
LEFT JOIN designations ON employees.designation_id = designations.id 
ORDER BY employees.id;

Anda dapat BERGABUNG DENGAN beberapa TABEL seperti contoh di atas.

sameerNAT
sumber
Sudah ada banyak jawaban, dari tahun sebelumnya, yang menunjukkan "menggabungkan beberapa tabel". Apa jawaban Anda menambah diskusi?
ToolmakerSteve
0

Kueri untuk menggabungkan lebih dari dua tabel:

SELECT ops.field_id, ops.option_id, ops.label
FROM engine4_user_fields_maps AS map 
JOIN engine4_user_fields_meta AS meta ON map.`child_id` = meta.field_id
JOIN engine4_user_fields_options AS ops ON map.child_id = ops.field_id 
WHERE map.option_id =39 AND meta.type LIKE 'outcomeresult' LIMIT 0 , 30
Manish
sumber
Sudah ada banyak jawaban, dari tahun sebelumnya, yang menunjukkan "menggabungkan beberapa tabel". Apa jawaban Anda menambah diskusi?
ToolmakerSteve
0

Gunakan ini:

SELECT s.name AS Student, c.name AS Course 
FROM student s 
  LEFT JOIN (bridge b CROSS JOIN course c) 
    ON (s.id = b.sid AND b.cid = c.id);
pengguna3477784
sumber
1
Jawaban ini tidak menambahkan hal baru untuk pertanyaan ini dan menggunakan sintaks yang aneh (jika bukan sintaks yang salah, saya akan terkejut jika ini bahkan valid di MySQL).
AeroX
Saya tidak setuju dengan AeroX. Sintaks gabungan Ansi dimaksudkan untuk membedakan masalah dengan sekolah lama koma / di mana sintaks bergabung. Saya ingin mengetahui apakah MySql mendukung ansi join sintaks secara khusus.
Larry Smith
0

Jangan bergabung seperti itu. Ini benar-benar latihan yang sangat buruk !!! Ini akan memperlambat kinerja dalam mengambil dengan data besar. Misalnya, jika ada 100 baris di setiap tabel, server database harus mengambil 100x100x100 = 1000000waktu. Itu harus diambil 1 millionberkali - kali. Untuk mengatasi masalah itu, gabungkan dua tabel pertama yang dapat mengambil hasil dalam pencocokan seminimal mungkin (Terserah skema database Anda). Gunakan hasil tersebut di Subquery lalu gabungkan dengan tabel ketiga dan ambil. Untuk join pertama -> 100x100= 10000times dan misalkan kita mendapatkan 5 hasil yang cocok. Dan kemudian kita bergabung dengan tabel ketiga dengan hasil -> 5x100 = 500.Total fetch = 10000+500 = 10200kali saja. Dan dengan demikian, kinerjanya naik !!!

Dracula Oppa
sumber