MySQLを使用して3つのテーブルを結合する


117

という名前の3つのテーブルがあります

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

さて、彼が勉強したコース名で学生名を表示するには、

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

次のクエリを作成します

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

しかし、それは必要な結果を返しません...

そして、私が他の人よりもマネージャーである人を見つけたい場合、正規化された形式はどうなるでしょう:

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

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

そして、この結果を得たい:

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

最初の結果で、
アーメド

回答:



199

ANSI構文を使用すると、テーブルを結合する方法がより明確になります。

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:私たちの答えは同じですが、構文のみが異なります。ANSI構文を認識していない場合は、それを学ぶのに時間をかける価値があります。これはJOIN、将来発生するようなエラーを回避するのに役立ちます。
RedFilter

16

フォームを正規化するため

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

順序はm.mid = e1.idandで重要m.eid = e2.idですか?
Pathros 2018年

1
@Pathrosいいえ、これらの式では順序は関係ありません。
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

この答えは、5年前にすでに与えられた答えと非常によく似ています。あなたの答えは重要で、既存の答えに欠けていると思いますか?
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;

上記の例のように、複数のテーブルを結合できます。


数年前から、「複数のテーブルの結合」を示す複数の回答があります。あなたの答えは議論に何を追加しますか?
ToolmakerSteve

0

3つ以上のテーブルを結合するクエリ:

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

数年前から、「複数のテーブルの結合」を示す複数の回答があります。あなたの答えは議論に何を追加しますか?
ToolmakerSteve

0

これを使って:

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
この答えは、この質問に新しいものを追加せず、奇妙なものを使用します(明白な間違った構文ではない場合、これがMySQLでさえ有効だったとしたら、私は驚きます)。
AeroX、2015

AeroXに同意しません。Ansi結合構文は、古い学校のコンマ/場所結合構文の問題を明確にすることを目的としています。MySqlがansi結合構文を具体的にサポートしているかどうかを確認しています。
ラリー・スミス

0

そのように参加しないでください。それは本当に悪い習慣です!!! 大量のデータをフェッチする際のパフォーマンスが低下します。たとえば、各テーブルに100行ある場合、データベースサーバーは100x100x100 = 1000000時間をフェッチする必要があります。1 million時間をかけてフェッチする必要がありました。この問題を解決するには、フェッチできる最初の2つのテーブルを結合して、一致を最小限に抑えます(データベーススキーマ次第です)。その結果をサブクエリで使用し、3番目のテーブルと結合してフェッチします。最初の結合-> 100x100= 10000回について、5つの一致結果が得られたとします。次に、3番目のテーブルを結果に結合します-> 5x100 = 500.Total fetch = 10000+500 = 10200times only。これでパフォーマンスが上がりました!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.