2012-04-13 9 views
1

Ich habe drei Tabellenmüssen andere Tabelle zu überprüfen, ob Feld in Tabelle 1 in es hat

students: first_name, last_name, high_school_id, other_high_school 

high_schols: id, title 

other_high_schools: id, title, student_id 

Ich möchte mit den folgenden Informationen eine Liste der einzelnen Schüler angezeigt werden: Vorname, Nachname, High-School-

Die Tabelle "high_schools" enthält eine Liste von High Schools, die ein Schüler auswählen kann, wenn er seine nicht findet. Er füllt seine High School im Feld "other high school" aus. Wenn der Student das Formular einreicht, wird seine Information gespeichert, wobei das Feld students.other_high_school auf 1 gesetzt wird und seine ID (student.id = other_high_school.student_id) mit dem Titel ihrer High School in der Tabelle other_high_schools (other_high_school.title) gespeichert wird.

select 
first_name, last_name, hs.title as high_school 
from 
students s 
left join 
high_schools hs 
on 
s.high_school_id = hs.id 

Das first_name zurückkehrt, last_name, high_school, aber ist es möglich, dass die Abfrage zu ändern, um festzustellen, ob students.other_high_school = 1, dann die other_high_school beitreten und nicht der high_schools Tisch?

Dies funktioniert nicht, sollte aber helfen, zu erklären, was ich versuche zu erreichen:

select 
first_name, last_name, hs.title as high_school 
from 
students s 

CASE s.other_high_school 
WHEN 0 THEN 
    left join 
    high_schools hs 
    on 
    s.high_school_id = hs.id 
WHEN 1 THEN 
    left join 
    other_high_school hs 
    ON 
    s.id = hs.student_id 
ELSE 
    left join 
    other_high_school hs 
    ON 
    s.id = hs.student_id 
END CASE 

GELÖST
select 
first_name, last_name, 
IF(s.other_high_school = 1, ohs.title, hs.title) high_school 
from 
students s 
left join 
high_schools hs 
on 
s.high_school_id = hs.id 
left join 
other_high_schools ohs 
on 
s.id = ohs.student_id 

Antwort

1

Erstens ich Ihr Schema überdenken würde. Brauchen Sie wirklich high_schools und other_high_schools in verschiedenen Tabellen? Oder könnten Sie einen Tisch mit einer zusätzlichen Flagge haben, ob es sich um eine Standard-Highschool oder eine vom Benutzer hinzugefügte High School handelt?

Zweitens habe ich das Gefühl, dass Ihre Lösung nicht sehr gut skalieren wird, da Sie LEFT JOIN auf allen drei Tischen sind. Wenn die Tabellen wachsen, vermute ich, dass sich die Leistung ziemlich schnell verschlechtert. Ich würde eine Alternative vorschlagen:

SELECT first_name, last_name,title 
FROM (
SELECT first_name, last_name,title 
FROM students s 
    INNER JOIN high_schools hs ON s.high_school_id = hs.id 
WHERE s.other_high_school=0 
UNION 
SELECT first_name, last_name,title 
FROM students s 
    INNER JOIN other_high_schools ohs ON s.high_school_id = ohs.id 
WHERE s.other_high_school=1 
) AS combined_schools 
ORDER BY last_name,first_name 

Mit der richtigen Indizes soll dies als Ihre Lösung so schnell sein und wird wahrscheinlich skaliert besser (aber dies alles hängt von der Form des realen Datensatz). Ich habe eine ORDER BY hinzugefügt, um zu zeigen, wie Sie die kombinierten Ergebnisse manipulieren können.

Verwandte Themen