Splash: SQL, etwas kompliziert

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:

files

ID
File
Server_ID

server

ID
Show

Gruss,
Splash

  1. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. 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_ID

    server

    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

    1. 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

      1. 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.