2012-11-09 49 views
9

Mam trzy tabele tak:Mysql dołączyć zapytanie na trzech tabel z wieloma kolumnami

specjalizacji

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

Osoba

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

Timing

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 

** Chcę uzyskać wynik coś takiego *

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

Opis:
Wszystkie trzy tabele są połączone.
Chcę wszystkie rekordy gdzie
specjalizacja id = '1'
osoba nazwa Jak 'abc'
rozrządu jest między '08: 00: 00' i '10: 00: 00 '.
Próbowałem kilka kombinacji połączeń mysql, ale nie można poprawnie pobrać danych.

+0

co jest 'time_from' czas dane i' time_to'? –

Odpowiedz

19

Można użyć INNER JOIN do tego,

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' 
+0

jaka jest różnica między moim kodem a moim? – AnandPhadke

+0

@AnandPhadke obaj wykonują to samo, ponieważ oboje używamy 'INNER JOIN'. –

+1

dzięki. Uratowałeś wiele mojego cennego czasu. :) –

0

To proste JOIN z należytym stanie WHERE.

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 

Jest to prosty stan, w którym trzeba użyć JOIN s do pobierania danych w ten sposób. Jest tak prosty, że otrzymasz go natychmiast po pierwszym użyciu. Być może to pytanie i odpowiedzi pomogą ci to zrozumieć.

+0

Dlaczego w dół? : o. Jeśli nie jest to idealna odpowiedź, czy ten przewodnik nie prowadzi do właściwego kierunku? I prawie wszystkie odpowiedzi, które przyszły później, używają tego samego kodu ditto! – nawfal

0
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' 
+2

'pid' będzie niejednoznaczne, aby wybrać alias @AnandPhadke – gks

+0

Thangs-Thanks za zrozumienie tego – AnandPhadke

+0

jesteś mile widziany @AnandPhadke – gks

1

Można użyć prostego Dołącz się ten

 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

+0

Błąd składni SQL –

0
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

Spróbuj:

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