2012-11-09 8 views
9

ich drei Tabellen wie dieses:Mysql-Abfrage auf drei Tabellen mit mehreren Spalten verbinden

Spezialisierung

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

Person

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

Zeit

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 

** Ich möchte wie dieses Ergebnis etwas bekommen *

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

Beschreibung:
Alle drei Tabellen verbunden sind.
Ich möchte alle Datensätze, in denen
Spezialisierung id = '1'
Person Name Wie
Timing 'ABC' ist zwischen '08: 00: 00' und '10: 00: 00 '.

Ich habe mehrere Kombinationen von mysql Joins versucht, aber nicht in der Lage, die Daten korrekt abzurufen.

+0

was ist die Datenzeit 'time_from' und' time_to'? –

Antwort

19

Sie INNER JOIN dafür verwenden können,

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

was ist der unterschied zwischen ur code und mir? – AnandPhadke

+0

@AnandPhadke beide führen das gleiche aus, da wir beide 'INNER JOIN' verwenden. –

+1

danke. Du hast viel von meiner kostbaren Zeit gespart. :) –

0

Dies ist ein straight forward JOIN mit entsprechenden WHERE Zustand.

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 

Dies ist ein einfacher Zustand, in dem Sie JOIN s verwenden, um Daten auf diese Weise zu holen. Es ist so einfach, dass Sie sofort nach der ersten Benutzung davon profitieren. Vielleicht werden diese Fragen und Antworten Ihnen helfen, es zu verstehen.

+0

Warum runter? :O. Wenn das nicht die perfekte Antwort ist, führt das OP nicht in die richtige Richtung? Und so ziemlich alle Antworten, die danach kamen, benutzen denselben Code! – 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' wird mehrdeutig sein, um Benutzeralias zu verwenden @AnandPhadke – gks

+0

Thangs-Thanks für das Herausstellen dieser – AnandPhadke

+0

Sie sind willkommen @AnandPhadke – gks

1

können Sie einfach verwenden wie diese Join

 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

SQL-Syntaxfehler –

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

Versuchen:

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