Объедините несколько таблиц в MySQL - PullRequest
0 голосов
/ 07 мая 2020

У меня есть три таблицы

sem1
--------------------------
roll | sub1 | sub2 | gpa |
--------------------------
001  | 98   | 99   | 8.5 |
002  | 99   |100   | 9.9 |
--------------------------

sem2
--------------------------
roll | sub3 | sub4 | gpa |
--------------------------
001  | 88   | 87   | 8.1 |
002  | 89   | 90   | 9.0 |
-------------------------- 

sem3
--------------------------
roll | sub5 | sub6 | gpa |
--------------------------
001  | 85   | 75   | 8.5 |
002  | 90   | 80   | 8.9 |
--------------------------

Я хочу получить только столбцы roll и gpa во всех трех таблицах с определенным номером рулона (скажем, 001) следующим образом.

-------------------------
|roll | gpa | gpa |gpa  |
-------------------------
| 001 | 8.5 | 8.1 | 8.5 |
-------------------------

Я написал следующий запрос

select roll,gpa,gpa,gpa 
    from sem1 natural 
    join sem2 natural 
    join sem3 
    where roll=001;

Но, похоже, он не работает. Есть предложения?

1 Ответ

1 голос
/ 07 мая 2020
• 1000 если ваши таблицы выглядят так
DROP TABLE IF EXISTS SEM1,SEM2,SEM3;
CREATE TABLE SEM1(roll INT primary key, sub1 INT, sub2 INT, gpa DECIMAL(10,2));
CREATE TABLE SEM2(roll INT primary key, sub3 INT, sub4 INT, gpa2 DECIMAL(10,2));
CREATE TABLE SEM3(roll INT primary key, sub5 INT, sub6 INT, gpa3 DECIMAL(10,2));

INSERT INTO sem1 VALUES
(001  , 98   , 99   , 8.5 ),
(002  , 99   ,100   , 9.9 );

INSERT INTO sem2 VALUES
(001  , 88   , 87   , 8.1 ),
(002  , 89   , 90   , 9.0 );

INSERT INTO sem3 VALUES
(001  , 85   , 75   , 8.5 ),
(002  , 90   , 80   , 8.9 );

Тогда ваш запрос (с поправками) даст результат -

select roll,gpa,gpa2,gpa3 
    from sem1 natural 
    join sem2 natural 
    join sem3 
    where roll=001;

+------+------+------+------+
| roll | gpa  | gpa2 | gpa3 |
+------+------+------+------+
|    1 | 8.50 | 8.10 | 8.50 |
+------+------+------+------+
1 row in set (0.001 sec)

Для ясности лучше всего уточнять имена столбцов, например

select SEM1.roll,SEM1.gpa,SEM2.gpa2,SEM3.gpa3 
from sem1 
natural join sem2 
natural join sem3 
where SEM1.roll=001;

Но не используйте естественные соединения, используйте левые соединения, например

select SEM1.roll,SEM1.gpa,SEM2.gpa2,SEM3.gpa3 
from sem1 
left join sem2 on sem1.roll = sem2.roll
left join sem3 on sem1.roll = sem3.roll
where SEM1.roll=001;

, но даже это недостаточно надежно, на мой взгляд, полагаясь, как и на вождение sem1, и всегда содержащий все различные номера рулонов, содержащиеся в sem2 и sem3. Более жестким подходом было бы получить все отчетливые номера рулонов со всех 3-х столов и двигаться дальше.

...