Abfrage Wert auch in weiterer Tabelle...
Antonia
- datenbank
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?
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
Danke für den Tip
DB ist Mysql 5
Nur wie muss es mit EXISTS heissen, wenn ich bereits eine WHERE Bedingung habe?
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
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.
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!
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
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!
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
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?
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
Klappt, Danke!
Grund ist eine momentane Hirnblockade...
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!