Verbinden von drei Tabellen mit MySQL


117

Ich habe drei Tabellen benannt

**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

Um nun den Schülernamen mit dem Kursnamen zu zeigen, den er studiert hatte,

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

Ich baue folgende Abfrage

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

Es wird jedoch nicht das gewünschte Ergebnis zurückgegeben ...

Und was wäre für eine normalisierte Form, wenn ich herausfinden möchte, wer Manager über andere ist:

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

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

Und will dieses Ergebnis bekommen:

**result**
--------------------
Manager      Staff
--------------------
ali          king
ali          mak
mak          sam
sam          jon

im ersten Ergebnis haben Sie Daten für ahmed und ali falsch eingestellt
NineCattoRules

Antworten:



199

Verwenden Sie die ANSI-Syntax und es wird viel klarer, wie Sie die Tabellen verbinden:

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 

9
@ Muhammad: Unsere Antworten sind die gleichen, sie unterscheiden sich nur in der Syntax. Wenn Sie sich der ANSISyntax nicht bewusst sind , lohnt es sich, sie zu lernen. Dies hilft Ihnen, JOINFehler zu vermeiden , die Sie in Zukunft gemacht haben.
RedFilter

16

Zum Normalisieren der Form

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

Ist die Reihenfolge in m.mid = e1.idund wichtig m.eid = e2.id?
Pathros

1
@Pathros Nein, in diesen Ausdrücken spielt die Reihenfolge keine Rolle.
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

Diese Antwort ähnelt sehr den Antworten, die bereits vor 5 Jahren gegeben wurden. Was ist mit Ihrer Antwort, die Sie für wichtig halten und die in vorhandenen Antworten fehlt?
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;

Sie können wie in diesem Beispiel oben mehreren Tabellen beitreten.


Es gibt bereits mehrere Antworten aus früheren Jahren, die "Zusammenfügen mehrerer Tabellen" anzeigen. Was trägt Ihre Antwort zur Diskussion bei?
ToolmakerSteve

0

Abfrage zum Verbinden von mehr als zwei Tabellen:

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

Es gibt bereits mehrere Antworten aus früheren Jahren, die "Zusammenfügen mehrerer Tabellen" anzeigen. Was trägt Ihre Antwort zur Diskussion bei?
ToolmakerSteve

0

Benutze das:

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

1
Diese Antwort fügt dieser Frage nichts Neues hinzu und verwendet eine seltsame (wenn nicht einfach falsche Syntax, wäre ich überrascht, wenn dies überhaupt in MySQL gültig wäre).
AeroX

Ich bin mit AeroX nicht einverstanden. Die Ansi-Join-Syntax soll Probleme mit dem Komma der alten Schule / der Join-Syntax eindeutig machen. Ich möchte wissen, ob MySql die Ansi-Join-Syntax speziell unterstützt.
Larry Smith

0

Mach nicht so mit. Es ist eine wirklich sehr, sehr schlechte Übung !!! Dies wird die Leistung beim Abrufen mit massiven Daten verlangsamen. Wenn beispielsweise 100 Zeilen in jeder Tabelle vorhanden sind, muss der Datenbankserver die 100x100x100 = 1000000Zeiten abrufen . Es musste 1 millionmal holen . Um dieses Problem zu beheben, verbinden Sie die ersten beiden Tabellen, die zu einem möglichst geringen Abgleich führen können (es liegt an Ihrem Datenbankschema). Verwenden Sie dieses Ergebnis in der Unterabfrage, verbinden Sie es mit der dritten Tabelle und rufen Sie es ab. Beim allerersten Join -> 100x100= 10000Mal und nehmen wir an, wir erhalten 5 übereinstimmende Ergebnisse. Und dann verbinden wir die dritte Tabelle mit dem Ergebnis -> 5x100 = 500.Total fetch = 10000+500 = 10200times only. Und so stieg die Leistung !!!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.