SQL, etwas kompliziert
Splash
- datenbank
Hi,
folgendes Problem:
Ich habe zwei SQL-Tabellen: files und server.
Die Reihen beider Tabellen verfügen über eine ID.
Jeder file-Eintrag ist einem server zugeordnet; der File-Eintrag verfügt also über ein Feld "Server_ID".
Nun kann der Server jedoch ausgelastet sein, sodass ich _keine_ Dateien dieses Servers anzeigen lassen möchte; dann ist der Server-Wert "Show" auf 0 gesetzt.
Kann ich nun mit einer einzigen SQL-Abfrage alle Einträge aus der files-Tabelle holen, bei denen der Server auf sichtbar gesetzt ist?
Hier nochmal die Tabellen zur Veranschaulichung:
ID
File
Server_ID
ID
Show
Gruss,
Splash
Hi,
Kann ich nun mit einer einzigen SQL-Abfrage alle Einträge aus der files-Tabelle holen, bei denen der Server auf sichtbar gesetzt ist?
das ist ein simpler Join. Schlage in der Dokumentation Deines DBMS (welches immer das sein mag) nach, wie Joins dort gehandhabt werden.
Cheatah
Hallo
Jeder file-Eintrag ist einem server zugeordnet; der File-Eintrag verfügt also über ein Feld "Server_ID".
Kann ich nun mit einer einzigen SQL-Abfrage alle Einträge aus der files-Tabelle holen, bei denen der Server auf sichtbar gesetzt ist?
Klar, ein simpler JOIN mit einer einfachen WHERE-Klausel.
SELFHTML aktuell hat zwei nette Artikel zu JOINs, du kommst mit Rouven Thimms
Einführung in Joins aus.
files
ID
File
Server_IDserver
ID
Show
Der Code für den JOIN lautet (falls Du nicht ein Datenbankmanagementsystem verwendest, das bereits im letzten Jahrtausend antiquiert war):
SELECT
f.File
FROM files f
INNER JOIN server s
ON f.Server_ID = s.ID
Die Einschränkung durch die WHERE-Klausel solltest Du selbst hinbekommen :-)
Freundliche Grüße
Vinzenz
Hi,
danke für deine Antwort.
Parallel habe ich selbst noch was probiert und habe nun zwei Varianten die funktionieren. :)
Doch welche ist die bessere/schnellste?
Siehe hier:
SELECT tfile.id
FROM file AS tfile, server AS ts
WHERE tfile.file = 'setup.exe'
AND tfile.server_id = ts.id
AND ts.list = '1'
GROUP BY tfile.server_id
SELECT o.id
FROM file o
INNER JOIN server s
ON o.server_id = s.id
WHERE o.file='setup.exe'
AND s.list='1'
GROUP BY o.server_id
Gruss,
Splash
Doch welche ist die bessere/schnellste?
Siehe hier:
SELECT tfile.id
FROM file AS tfile, server AS ts
WHERE tfile.file = 'setup.exe'
AND tfile.server_id = ts.id
AND ts.list = '1'
GROUP BY tfile.server_id
SELECT o.id
FROM file o
INNER JOIN server s
ON o.server_id = s.id
WHERE o.file='setup.exe'
AND s.list='1'
GROUP BY o.server_id
Ausprobieren, vermutlich übersetzt der Datenserver beide Codes identisch, führt sie gleich aus.
Variante 1 ist aber auf jeden Fall gefährlicher da Produkte gebildet werden, da kan böse danebengegriffen werden und die Ausführungszeiten explodieren.
Variante 2 ist zudem auch intuitiver und flexibler.