sqlite join

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Nabend,
das ist zwar kein Spezielles Python- Problem, sondern eher ein SQL-Problem. Ich verwende sqlite3. Nehmen wir an ich habe 2 Tabellen:

Code: Alles auswählen

CREATE TABLE "teams" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "name" TEXT)

CREATE TABLE "games" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "id_team_home" INTEGER,
    "id_team_guest" INTEGER,
    "complete" INTEGER)
Nun möchte ich eine Abfrage machen mit der ich gleich die Namen zu den Teams mitgeliefert bekomme die in der Tabelle `games` referenziert werden. Das sähe für `id_team_home` beispielsweise so aus:

Code: Alles auswählen

 
SELECT games.id_play_day, teams.name AS home, teams.name AS home
   FROM games INNER JOIN teams ON
     teams.id = games.id_team_home
WHERE games.complete = 0
meine Frage wäre nun: Wie bekomme ich den Namen für `id_team_guest` direkt mitgeliefert? Ich könnte ja noch einen JOIN machen, aber woher weiss ich auf welche `teams.id` der angewendet wird? Ist das so einfach überhaupt möglich, oder muss ich das beim erstellen der Datenbank als FK angeben und die Abfrage völlig anders stellen?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Standard-SQL dafür sähe beispielsweise so aus:

Code: Alles auswählen

SELECT 
    games.id_play_day, 
    teams_home.name AS name_home, 
    teams_guest.name AS name_guest
  FROM 
    games 
  JOIN teams teams_home ON
    teams_home.id = games.id_team_home
  JOIN teams teams_guest ON
    teams_guest.id = games.id_team_guest
  WHERE 
    games.complete = 0
Zuletzt geändert von /me am Mittwoch 20. April 2011, 19:21, insgesamt 1-mal geändert.
BlackJack

@Lonestar: Du müsstest zweimal mit `teams` "joinen", der Tabelle dabei aber jeweils (oder mindestens einmal) ein Alias verpassen, damit man die auseinander halten kann. Ungetestet:

Code: Alles auswählen

select games.id, t1.name as home, t2.name as guest
from games
join teams t1 on t1.id = games.id_team_home
join teams t2 on t2.id = games.id_team_guest
;
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Danke,
der Tabelle nen Alias verpassen hatte ich mir schon vermutet, aber kein Beispiel im Netz gefunden (ist immer so ein Problem wenn man nicht weiß wonach man sucht :roll: ). Auf die Idee wäre ich jetzt aber nicht gekommen das ich den Alias für den select auch verwenden darf bevor ich das Alias überhaupt definiert habe.
Da habe ich doch mal wieder was dazugelernt.

Danke euch beiden
Sebastian
Antworten