Datemod Beispiel 3

  • Quote from albemi

    wie versteht man welche join man verwenden soll?

    ...na ja...wenn du weißt was du brauchst und weißt wie die JOINs funktionieren dan benutzt du den JOIN den du brauchst...(bessere antwort weiß ich nicht)


    Quote from albemi

    wieso nach join und left join wird immer der on klausel geschrieben ?

    ..das ON sagt wo(im welchen attribut,"spalte der tabelle") genau man die tabellen joinen soll, bei NATURAL JOIN brauchst du das ON nicht, weil es automatisch bei den gleichnamigen attributen joint:
    z.B.
    mit NATURAL JOIN:

    Code
    1. Person NATURAL JOIN Musiker

    ist das selbe wie:
    mit JOIN:

    Code
    1. Person JOIN Musiker ON Person.ID = Musiker.ID

    ("Person" und "Musiker" haben das gleichnamige attribut "ID")


  • Gebt es zu, so beschissen hat es keiner geschafft das Bsp zu lösen. Btw. ich hab nicht mal Ahnung ob es stimmt, was meint ihr?


    Mann, wie ich dieses SQL zeug hasse.:distur:

  • Es kommt da einer zu viel raus bei dir. Das Ergebnis sollte nur

    Code
    1. 2002 Peppi Bauer 1957-10-14
    2. 2003 Peppi Bauer 1963-05-17


    sein.


    Warum eigentlich so kompliziert, wenns z.B. auch so geht:

    SQL
    1. SELECT p.vorname, p.zuname
    2. FROM komponist k
    3. NATURAL JOIN person p
    4. INNER JOIN werk w ON p.id = w.id
    5. WHERE date_part('year', w.komponiert) = '1987' AND p.id NOT IN (SELECT DISTINCT id FROM werk WHERE date_part('year', komponiert) = '1968')
    6. ORDER BY p.zuname, p.vorname;


    ;)

  • Jo stimmt habs auch grad bemerkt ... najo ich werds dann wohl doch anders Probieren :coolsmile Danke fürs Feedback

  • ad bsp 26:

    Quote

    SELECT a.titel, a.datum
    FROM aufnahme a left JOIN spielt s on (a.id = s.ida) JOIN person p on (s.idm = p.id)
    WHERE extract(year FROM age(datum, geburtsdatum)) < 20
    GROUP BY a.id, a.titel, a.datum
    HAVING COUNT(DISTINCT(idm)) >= 2;



    kann das stimmen, oder steh ich auf der leitung und das ist blödsinn?

    danke

  • Quote from albemi

    sorry maybe i m repeating it but...welche ist die unterschied zwischen die JOIN s ?wie versteht man welche join man verwenden soll?ich checke es irgendwie nicht.wieso nach join und left join wird immer der on klausel geschrieben ?


    falls du dir das empfohlene Buch gekauft hast - auf seite 91 hast du eine super - grafische erklärung (anhand dieser hab ich es dann ganz verstanden)


    oder halt bei google =)


    http://de.wikipedia.org/wiki/Join#Join

    Open TU IRC - freier, unzensierter Informationsaustausch - Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum.
    ____________________________________________________

  • was im buch als select * bezeichnet wird, kann man das so 1:1 übernehmen oder... wollte gerade in der dokumentation suchen aber das hab ich nix gscheites gefunden.

  • Quote from kommensal

    was im buch als select * bezeichnet wird, kann man das so 1:1 übernehmen oder... wollte gerade in der dokumentation suchen aber das hab ich nix gscheites gefunden.


    Was genau ist die Frage? select * kannst du klar nehmen, nur wirst du in so gut wie keinem Bsp das nehmen können, da du ja nur spzielle Sachen selecten musst,damit es geht!

  • Naja, mit SELECT * gibst du alles aus, was du bei FROM stehen hast, also ja, das kann man so aus dem Buch übernehmen, denk ich mal...:)

    Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.
    (Dan Rather, CBS-Fernsehreporter.)

  • Vielleicht kann mir jemand helfen,weil ich such schon seit stunden nach der lösung.
    UNd zwar häng ich am Beispiel 9.Ich hab diese Angabe zur Zeit:

    SELECT p.Vorname,p.Zuname,count (w.Titel) as Anzahl
    FROM Person p,Komponist k,Werk w
    WHERE k.ID=w.ID
    AND p.ID=w.ID
    GROUP BY p.Vorname,p.Zuname,p.ID
    ORDER BY Anzahl desc,p.Zuname asc

    Soweit funktioniert sie gut,nur dass mir die zeile mit dem nullwert von nix-fertig bring nicht angezeigt wird.wie kann ich das bewerkstelligen dass die zeile mir auch angezeigt wird?

  • Da musst du auf die Tabelle werke einen LEFT JOIN machen, sonst werden die Komponisten, die nix komponiert haben, nicht berücksichtigt. Mit dem LEFT JOIN bleiben alle Komponisten erhalten.


    So z.B.:

    SQL
    1. SELECT p.vorname, p.zuname, count(w.titel) AS anzahl
    2. FROM komponist k
    3. NATURAL JOIN person p
    4. LEFT JOIN werk w ON w.id = k.id
    5. GROUP BY p.id, p.vorname, p.zuname
    6. ORDER BY anzahl DESC, Zuname ASC;
  • Danke dir für deine hilfe!ja jetzt hab ichs auch so obwohl ich ungerne mit den Joins arbeite ;)
    Beim lösen der weiteren Beispiele hab ich eine weitere Fragen entdeckt:

    Als ich für Beispiel 10 mir mal die Lösungswege von euch angeschaut,weil ich nicht weitergekommen bin und verstehe nicht wieso ihr:

    HAVING count(b.name) = (SELECT count(name) FROM instrument)

    verwendet.Das count=count verwirrt mich ein bisschen und ich bitte deshalb um erklärung.Was hat das count=count für einen sinn wenn man das maximum der gespielten Instrumente suchen könnte?

  • Es hat den Sinn, dass die Anzahl der Tupel in einer Gruppe (=einer Person, da ja die Werte von Name gleich sind, also immer Maier in einer Gruppe bei Name und dann immer Huber z.B.) gleich der Anzahl der vorhandenen Instrumente ist! Denn diese Person kann dann genau alle Instrumente!
    Ist das irgendwie verständlich erklärt??

  • ich hab auch noch ne nette Lösung zu 26 fabriziert:


    PHP
    1. SELECT a.ID AS Aufnahme, a.Titel, s.IDM
    2. FROM Person p natural join Musiker m inner join spielt s on m.ID=s.IDM inner join Aufnahme a on s.IDA=a.ID
    3. WHERE ((a.Datum - p.Geburtsdatum)/365) < 20 GROUP BY a.ID, a.Titel, m.ID, s.IDM HAVING COUNT(idm) >= 2


    hoffentlich passt alles und ich muss nicht wieder drei mal hin (wird sich auch schwer ausgehen)

  • Quote from Metaphor


    Als ich für Beispiel 10 mir mal die Lösungswege von euch angeschaut,weil ich nicht weitergekommen bin und verstehe nicht wieso ihr:
    HAVING count(b.name) = (SELECT count(name) FROM instrument)


    habs so:

    Code
    1. select zuname, geburtsdatum
    2. from person natural join beherrscht
    3. group by zuname, geburtsdatum, id
    4. having count(beherrscht.id)
    5. =
    6. (select count(instrument) from instrument)


    erklärung:


    ich wähle zuname und gebdat aus person aus und joine mit beherrscht. das mach ich, weil in person der vorname und das gebdat stehen und in beherrscht steht dann das instrument drin, das eine person spielt.
    dann muss ich gruppieren. erstens muss ich nach zuname, gebdat gruppieren, weil ich das ja später ausgeben will und 2. muss ich auch nach ID gruppieren. hat 2 gründe. 1. weils mehrere personen gibt, die am gleichen tag geb.tag haben und 2. weil ich später diese ids zählen will!
    count(beherrscht.id) macht nix andres, wie von jeder einzelnen person (die ja jetzt gruppiert sind) zu zählen, wieviele instrumente diese person spielt.
    Also wär zB bei Spielt-Alles 3.
    und (select count(instrument) from instrument)
    zählt einfach nur, wieviele instrumente in der instrumententabelle stehen.


    das heißt also:
    wenn ich eine person habe, deren count(id) == 3, dann geb ich die person aus ,denn es stehen momentan auch nur 3 instrumente in der instrumententable.


    da ist eben das group by wichtig, damit ich pro person die instrumente zählen kann mittels ID und dann vergleichen kann wieviele instrumente in der instrumententable stehn



    lange erklärung- sorry. verstanden?

    :cheer: manamana :dance: düdüdüdüdü :trampolin: :cheer:

  • Danke euch für eure Hilfe!
    Ich glaube jetzt ists mir klar geworden,wills aber anhand von Beispiel 15 nochmal überprüfen.

    SELECT DISTINCT

    p.vorname, p.zuname


    FROM

    spielt s


    INNER JOIN

    musiker m ON s.idm = m.id
    NATURAL JOIN
    person p


    WHERE

    s.ida IN (SELECT s.ida FROM spielt s GROUP BY s.ida HAVING count(DISTINCT s.idm) = 1)


    ORDER BY

    p.zuname, p.Vorname

    wieder das count=1,soweit wie ich das verstanden hab durch eure erklärung würde das so heißen das zuerst die tabelle nach ida gruppiert werden und dann die musiker gezählt werden.wenn für pro jede aufnahme nur ein musiker existiert,daher also der einzer,wird der musiker ausgegeben.
    Ist mein gedankengang richtig?

    Ansonsten danke euch vielmals für eure Antworten,die mir sehr weiter geholfen haben!