web-dev-qa-db-fra.com

Mysql jointure requête sur trois tables avec plusieurs colonnes

J'ai trois tables comme celle-ci:

Spécialisation

sid | s_name
--------------
 1  | test 1
 2  | test 2  

La personne

pid | name | sid
------------------
 1  | ABC  |  1
 2  | XYZ  |  2

Calendrier

tid | time_from | time_to  | pid
----------------------------------
 1  | 08:00:00  | 10:00:00 |  1
 2  | 20:00:00  | 22:00:00 |  1
 3  | 09:00:00  | 14:00:00 |  2
 4  | 19:00:00  | 20:00:00 |  2

** Je veux obtenir un résultat comme ça *

pid | name | s_name | time_from  | time_to
--------------------------------------------
 1  | ABC  | test 1 | 08:00:00   | 10:00:00

La description:
Les trois tables sont connectées.
Je veux tous les disques où
spécialisation id = '1'
personne nom comme 'ABC'
timing se situe entre '08: 00: 00 'et '10: 00: 00'. 

J'ai essayé plusieurs combinaisons de jointures mysql mais je n’ai pas pu récupérer les données correctement. 

10
Murtaza Malek

Vous pouvez utiliser INNER JOIN pour cela,

SELECT  a.pid, a.name,
        b.sname,
        c.time_from,
        c.time_to
FROM    person a
        INNER JOIN specialisation b
            ON a.sid = b.sid
        INNER JOIN Timing c
            ON a.pid = c.pid
WHERE   a.sid = 1 and 
        a.name='ABC'  AND 
        c.time_from >= '08:00:00' AND c.time_to <= '10:00:00'
20
John Woo

Vous pouvez utiliser Simple Join comme ceci

     Select P.pid , name , s_name ,time_from ,
     time_to from Specialisation S 
     Join Person P on P.sid=S.sid 
     Join Timing T on T.pid= P.pid 
     where T.time_from >= '08:00:00' AND T.time_to <='10:00:00' And P.name='ABC';

Fiddle

1
gks

Ceci est une simple JOIN avec la condition WHERE appropriée.

 SELECT t.pid, p.name, s.s_name, t.time_from, t.time_to 
 FROM   Timing AS t
 JOIN   Person AS p ON p.pid = t.pid
 JOIN   Specialisation AS s ON s.sid = p.sid
 WHERE  s.sid = 1
    AND t.time_from >= 08:00:00 AND t.time_to <= 10:00:00

Il s'agit d'une condition simple dans laquelle vous devez utiliser JOINs pour récupérer les données de cette façon. C'est tellement simple que vous en aurez une bonne après votre première utilisation. Peut-être que cette question et les réponses vous aideront à comprendre.

0
nawfal
SELECT p.pid, p.name, s.s_name, t.time_from, t.time_to 
FROM   Timing AS t
JOIN   Person AS p ON p.pid = t.pid
JOIN   specialisation AS s ON s.sid = p.sid
WHERE  s.sid = 1 and p.name='ABC'
AND t.time_from >= '08:00:00' AND t.time_to <= '10:00:00'
0
AnandPhadke
SELECT B.PID pid, B.NAME name, A.SNAME s_name, C.TIME_FROM time_from, C.TIME_TO time_to
FROM SPECIALISATION A, PERSON B, TIMING C
WHERE A.SID = 1 AND A.SID=B.SID AND B.PID=C.PID 
AND C.TIME_FROM >=08:00:00 AND C.TIME_TO <=10.00.00
0
Shamis Shukoor

Essayez:

    SELECT t.pid, p.name, s.s_name, t.time_from, t.time_to 
     FROM   Specialisation AS s
    left join  Person AS p ON p.sid = s.sid
    left join  Timing AS t ON t.pid = p.pid
    WHERE  s.sid = 1
        AND t.time_from >= 08:00:00' AND t.time_to <= 10:00:00
group by t.tid 
0
Bajrang