Antonia: Abfrage Wert auch in weiterer Tabelle...

Hi

Ich habe eine Tabelle "Schueler" und "Teilnehmer".

Die Abfrage an die Tabelle Schueler lautet:
SELECT birth,name,Bild,Lebensalter FROM Schueler WHERE Lebensalter < 50 ORDER BY Lebensalter DESC LIMIT 10

Dazu sollen aber nur Datensätze kommen, bei denen der Name unter "name" auch in der Tabelle "Teilnehmer" vorhanden ist.
Gibt es den Namen in Spalte "name" unter Tabelle "Teilnehmer" nicht, soll er im Ergebnis auch nicht auftauchen.

Ich habe mich mit JOIN varianten probiert, die dauern aber recht lange und die ergebnisse waren nicht o.k. Komme nicht weiter...

Hat jemand eine Lösung?

  1. Mahlzeit Antonia,

    Ich habe mich mit JOIN varianten probiert, die dauern aber recht lange und die ergebnisse waren nicht o.k. Komme nicht weiter...

    JOINs sind nicht immer die beste Lösung. Ich gebe Dir mal das Stichwort "EXISTS".

    Leider hast Du nicht angegeben, mit welchem Datenbanksystem in welcher Version Du arbeitest - sonst könnte man noch besser helfen (keine Arme - keine Kekse) ...

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Danke für den Tip

      DB ist Mysql 5

      Nur wie muss es mit EXISTS heissen, wenn ich bereits eine WHERE Bedingung habe?

  2. Hi,

    Ich habe mich mit JOIN varianten probiert, die dauern aber recht lange

    Fehlt hier evtl. der Index auf der Spalte, die die Verbindung herstellt?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Bounjoun Antonia,

    Die Abfrage an die Tabelle Schueler lautet:
    SELECT birth,name,Bild,Lebensalter FROM Schueler WHERE Lebensalter < 50 ORDER BY Lebensalter DESC LIMIT 10
    Dazu sollen aber nur Datensätze kommen, bei denen der Name unter "name" auch in der Tabelle "Teilnehmer" vorhanden ist.
    Gibt es den Namen in Spalte "name" unter Tabelle "Teilnehmer" nicht, soll er im Ergebnis auch nicht auftauchen.

    Ähnliche Situation hatte ich in diesem Thread. Siehe Antwort von hotti.

    Adiou.

    --
    Ich bin eigentlich ganz anders, aber ich komme so selten dazu. - Ödön von Horwáth
    Ist Rudi Carrell Gott? Oder George Harrison Ford?
    Ich bin faul und das ist gut so.
    1. Hi!

      Dazu sollen aber nur Datensätze kommen, bei denen der Name unter "name" auch in der Tabelle "Teilnehmer" vorhanden ist.
      Gibt es den Namen in Spalte "name" unter Tabelle "Teilnehmer" nicht, soll er im Ergebnis auch nicht auftauchen.
      Ähnliche Situation hatte ich in diesem Thread. Siehe Antwort von hotti.

      Ein Join ist in dem Fall vermutlich nicht notwendig. Laut Beschreibung geht es nur darum, ein Selektionskriterium für Schüler zu haben, das sich in einer anderen Tabelle befindet. Dass im Ergebnis Daten aus der anderen Tabelle erscheinen sollen, war nicht erwähnt. Das Ergebnis lässt sich mit dem bereits erwähnten EXISTS erzielen.

      Lo!

      1. Das Ergebnis lässt sich mit dem bereits erwähnten EXISTS erzielen.

        Das habe ich schon angesehen. Nur komme ich nicht zurecht wie es lauten muss wenn ich ein WHERE bereits habe. Da gibt es kein Beispiel dafür.

        WHERE Lebensalter < 50

        1. Hi!

          Nur komme ich nicht zurecht wie es lauten muss wenn ich ein WHERE bereits habe. Da gibt es kein Beispiel dafür.

          Zwei Bedingungen verknüpft man mit AND (oder OR).

          Lo!

          1. Zwei Bedingungen verknüpft man mit AND (oder OR).

            ja, ist klar, nur warum gehts nicht?
            Die Namen stimmen natürlich, Ich achte auf Gross und Kleinschreibw.

            SELECT birth,name,Bild,Lebensalter FROM Schueler WHERE EXISTS (SELECT name FROM Schueler,Teilnehmer WHERE name.Schueler = name.Teilnehmer) AND Lebensalter < 50 ORDER BY Lebensalter DESC LIMIT 10

            Ich bekomme:
            Column 'name' in field list is ambiguous

            1. So ist schon mal fehlerfrei, aber es erscheinen die Namen trotzdem. ES wird nicht verglichen, Namen sollen nur ausgegeben werden, die auch in Teilnehmer vorhanden sind.

              SELECT  
               birth,name,Bild,Lebensalter  
               FROM Schueler  
               WHERE EXISTS  
               (SELECT name.Schueler,name.Teilnehmer FROM Schueler,Teilnehmer WHERE name.Schueler = name.Teilnehmer AND Lebensalter < 50)  
               ORDER BY Lebensalter DESC LIMIT 10
              

              Mann , eine schwere Geburt...Eine Idee?

              1. Ist das wirklich so schwierig?

                in Prosa:
                Gib mir alle Datensätze aus Schueler mit birth, name, bild, lebensalter, welche
                a) jünger als 50 sind
                b) in der Tabelle Teilnehmer enthalten sind (Spalte "name" dient zum Vergleich)

                in SQL

                SELECT  
                birth,name,Bild,Lebensalter  
                FROM Schueler s  
                WHERE Lebensalter < 50  
                AND EXISTS (SELECT * FROM Teilnehmer t WHERE t.name = s.name)  
                ORDER BY Lebensalter DESC LIMIT 10
                
                1. Klappt, Danke!

                  Grund ist eine momentane Hirnblockade...

            2. Hi!

              ja, ist klar, nur warum gehts nicht?

              Wir können nicht hellsehen. Du musst uns schon genau beschreiben, was du machst, was rauskommen soll und was stattdessen kommt, inklusive Fehlermeldung.

              SELECT birth,name,Bild,Lebensalter FROM Schueler WHERE EXISTS (SELECT name FROM Schueler,Teilnehmer WHERE name.Schueler = name.Teilnehmer) AND Lebensalter < 50 ORDER BY Lebensalter DESC LIMIT 10

              Man notiert zuerst den Tabellen-/Alias-Namen, dann den Punkt und den Feldnamen. Und bei EXISTS-Subquerys interessiert sich das DBMS für keine Spaltennamen, da darf also ruhig ein * stehen. Außerdem kommt in die Subquery-FROM-Klausel nur die andere Tabelle. Was du da notiert hast, ist ein Inner Join, der jeden Datensatz mit jedem verknüpft. Da kommt also immer eine Ergebnismenge und EXISTS liefert TRUE (außer wenn Schueler und Teilnehmer gar keine Schnittmenge haben). Du brauchst stattdessen eine korrelierte Subquery, bei der ein Wert der äußeren Query mit einem der inneren Query in Beziehung gesetzt wird. Die innere Query fragt demnach nur die Teilnehmer ab, mit der Bedingung, dass der Teilnehmer.name mit dem Schueler.name übereinstimmt.

              Lo!