Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20
  1. #11
    Registriert seit
    07 2008
    Beiträge
    9
    Habe jetzt auch die anderen beiden Aufgaben korriegiert die ich falsch hatte. Die waren aber net weiter schwer werde sie aber trotzdem mal posten, vielleicht fällt jemanden ein Fehler auf etc...
    Beide Aufgaben sollten aber meiner Meinung nach jetzt korrekt sein ^^ aber man weiss ja nie...
    1.Ausgabe der Benutzernr aller Benutzer die ein Buch ausgeliehen haben, für die eine Vormerkung
    existiert sowie die ISBN des betroffenen Buchs. Dabei soll jedes Exemplar höchstens einmal
    ausgegeben werden.

    Lösung:
    SELECT DISTINCT benutzernr, isbn FROM Ausleihe
    WHERE Vormerkung.exemplarisbn=Ausleihe.exemplarisbn;

    2.Ausgabe von Ausleihtag und ISBN aller ausgeliehenen Bücher vom Benutzer mit der Nummer 1:

    Lösung:
    SELECT tag, isbn FROM Ausleihe
    WHERE Ausleihe.benutzernr = '1' ;


    Ich denke mal das dass so richtig ist, aber ich geh mal lieber auf Nummer.

  2. #12
    Registriert seit
    12 2007
    Ort
    Südpfalz
    Beiträge
    1.307
    ist falsch - schau mal, du verwendest bei 1) zwei Tabellen, nämlich Ausleihe und Vormerkung - deine From-Klausel umfasst aber nur Ausleihe. Wo ist der Join auf Vormerkung?

    Die Frage ist unklar formuliert... alle Benutzer, für die beides gleichzeitig zutrifft? (also vormerkung UND ausleihe?) Oder Nutzer, für die entweder das eine, oder das andere gilt? ODER sollen die Bücher ausgegeben werden, dann ggf. mit den Benutzern, die sie geliehen oder vorgemerkt haben? Ist total schwammig, diese Angabe.

    Ich gebe dir mal ein Beispiel, das alle Benutzer mit ihren Büchern listet - und dem vermerk, ob es ausgeliehen ist oder eine vormerkung hat:

    Code:
    select Benutzer.Nummer as BeNr,
           Benutzer.Name as BeName,
           Exemplar.Titel as Buch,
           Buecher.Aktion
      from Benutzer
     inner join (select Ausleihe.Benutzernr as BNR,
                        Ausleihe.exemplarisbn as ISBN,
                        'ausgeliehen' as Aktion
                   from Ausleihe
                 UNION
                 select Vormerkung.benutzernr as BNR,
                        Vormerkung.exemplarisbn as ISBN,
                        'vorgemerkt' as Aktion
                   from Vormerkung
                ) as Buecher
     inner join Exemplar on Exemplar.isbn = Buecher.ISBN
     order by Benutzer.Nummer, Exemplar.ISBN
    Das ergäbe folgende Liste:
    Code:
    BeNr | BeName   | Buch                   | Aktion
    -----|----------|------------------------|------------
     1   | Bartusch | Java is auch ein Insel | vorgemerkt
    -----|----------|------------------------|------------
     1   | Bartusch | UML 2 kompakt          | ausgeliehen
    -----|----------|------------------------|------------
     2   | Lehmann  | Java-Programmieren...  | vorgemerkt
    -----|----------|------------------------|------------
     2   | Lehmann  | UML 2 kompakt          | vorgemerkt
    -----|----------|------------------------|------------
     3   | Kohlack  | Java is auch ein Insel | ausgeliehen
    -----|----------|------------------------|------------
     3   | Kohlack  | Java-Programmieren...  | ausgeliehen
    -----|----------|------------------------|------------
     3   | Kohlack  | UML 2 kompakt          | vorgemerkt
    Was Aufgabe 2 angeht: FAST richtig. Nur ein Fehler:

    Code:
    WHERE Ausleihe.Benutzernr = '1'
    Das ist falsch - in Hochkommata setzt man CHAR-Werte (wie Namen), KEINE Zahlen! Die Benutzernummer ist ein Integer-Wert, also eine Ganzzahl. Korrekt ist daher

    Code:
    WHERE Ausleihe.Benutzernr = 1
    OHNE die '' um die 1 herum!

    =========================
    Generelle Empfehlung
    =========================

    Ja, ich weiß, Joins können total nervend sein, weil sie eine gewisse Komplexität haben - aber setzt dich damit noch einmal auseinander. Dringend.

    Lerne den Unterschied zwischen INNER JOIN und LEFT JOIN - das sind die beiden wichtigen. (Der RIGHT JOIN ist nicht praxisrelevant, da er durch einen LEFT JOIN ersetzt werden kann; ein Full Outer Join ist auch höchst fragwürdig, da du in der Praxis nur sehr, sehr selten ein kartesisches Produkt brauchst.)

    Mach dir die Arbeitsweise klar. Und bevor du einen Select schreibst, überlege:

    - Welche Daten brauche ich?

    - Aus welcher Tabelle kommt welches Feld, ergo: Welche Tabellen brauche ich?

    - Wie kann ich diese Tabellen sinnvoll miteinander verknüpfen?

    - Welche der Tabellen enthält "optionale" Daten (aka: LEFT JOIN), welche essentiellen? (INNER JOIN)

    Lies deine Sachen nochmal gründlich durch.

    Oh, und frag bei unklaren Fragestellungen nach; Aufgabe 1 ist zum Beispiel völlig unklar. Wenn sich die ISBN innerhalb des Benutzers nicht wiederholen darf, ist das ohnehin Quark, alldieweil: Ein Benutzer kann ein Buch NICHT 2-mal gleichzeitig geliehen haben. Er kann es auch nicht gleichzeitig in der Ausleihe UND in der Vormerkung haben.

    Falls das doch möglich wäre, umfasst der Subselect einen weiteren Subselect - da wird der UNION dann eine Ebene tiefer gelegt und im ersten Subselect mit einem Group By gearbeitet; über geschickte min/max-Anwendungen kann man dann schön differenzieren ;-)
    Beste Grüße,
    WITM55

    sicherer E-Mail-Kontakt: Über den Schlüssel 3DE6FF44 (zum Beispiel über Server http://wwwkeys.de.pgp.net/ mit dem Suchstring 0x3DE6FF44 zu beziehen)

    Code:
    BOFH Excuse #227: Fatal error right in front of screen.

  3. #13
    Registriert seit
    05 2006
    Ort
    Berlin
    Beiträge
    1.387
    [spam - sinnfrei]
    tjoar und somit is die vewirrung für jeden nicht MySQL freak komplett
    [/spam - sinnfrei]
    Soo genau muss eine Fehlerbeschreibung gar nicht sein.
    Dank unserer übersinnlichen Fähigkeiten reicht ein einfaches "Es geht net." vollkommen aus.
    Parapsychologie ist was feines...

    Chaos ist nur eine Form der Ordnung die wir verlernt haben.

  4. #14
    Registriert seit
    07 2008
    Beiträge
    9
    mal wieder danke an deine Hilfe ^^
    also habe 2. verbessert wegen den strichen.
    bei 1.
    SELECT DISTINCT benutzernr, isbn FROM Ausleihe
    WHERE Vormerkung.exemplarisbn=Ausleihe.exemplarisbn;

    die FROM Anweisunf geht nur in Ausleihe da ja nur die Benutzernr und die ISBN ausgegeben werden soll. Bei der WHERE Bedingung schreib ich ja dazu welche exemplarisbn miteinander verglichen werden soll. also die aus Vormerkung und die aus Ausleihe : Ausleihe.exemplarisbn. Somit bin ich ja dann in der Ausleihe. ich habs ja davor geschrieben. Wenn ich mich irre dann korriegiere mich.
    Man könnte das ganze ja auch so schreiben:
    SELECT DISTINCT Ausleihe.benutzernr, Ausleihe.isbn FROM Ausleihe, Vormerkung
    WHERE Vormerkung.exemplarisbn=Ausleihe.exemplarisbn;

    wäre das so besser? Ist ja eigentlich meiner Meinung nach nichts anderes als was ich gemacht habe oder?

  5. #15
    Registriert seit
    12 2007
    Ort
    Südpfalz
    Beiträge
    1.307
    Hehe, das sagst du - ich würde ja mal ein Praxisbeispiel aus meiner täglichen Arbeit posten. Ich befürchte nur einfach, dass das Forum hier nicht so viele Zeichen für einen Beitrag zulässt - aber einen Versuch wäre es wert. Wenn du dich mal wirklich völlig verwirren lassen willst

    State of maximum Confussion: established

    Mission: accomplished
    Beste Grüße,
    WITM55

    sicherer E-Mail-Kontakt: Über den Schlüssel 3DE6FF44 (zum Beispiel über Server http://wwwkeys.de.pgp.net/ mit dem Suchstring 0x3DE6FF44 zu beziehen)

    Code:
    BOFH Excuse #227: Fatal error right in front of screen.

  6. #16
    Registriert seit
    12 2007
    Ort
    Südpfalz
    Beiträge
    1.307
    @Miller:

    Deine Nummer 1 führt zu einem Fehler.... Du verwendest in der WHERE-Klausel ein Feld aus Vormerkung, DASS ER NICHT KENNT! Er arbeitet NUR mit den Daten aus den Tabellen, die er kennt. Und er kennt nur die Felder aus AUSLEIHE, weil Vormerkung nicht in der From-Klausel ist. Das gehört also rein.


    Darüberhinaus ist eine Verknüpfung von Ausleihe zu Vormerkung über ISBN _eigentlich_ Quark.

    Warum? Ganz einfach:

    Du bekommst so nur Bücher, die in beiden Tabellen mindestens einmal vorkommen. Nehmen wir an, wir hätten das Buch "MySQL für Anfänger", für das es eine Vormerkung, aber keine Ausleihe gibt. Würde es auf deiner Liste erscheinen? Antwort: NEIN!

    Denn mit "Ausleihe.ISBN = Vormerkung.ISBN" findest du nur noch Bücher, die in beiden Tabellen vorkommen (das IST ein INNER JOIN).

    Und nochmal: Alle Felder, die du verwenden willst - egal ob im SELECT oder in der WHERE-Klause - MÜSSEN in den Tabellen stehen, die in der FROM-Klausel und den Joins genannt werden.

    Es ist egal, ob der Select nur Felder aus einer Tabelle umfasst - scheißegal! Wichtig ist, welche Felder du verwendest - und dazu gehören die "sichtbaren", die über Select ausgegeben werden, genauso wie die "unsichtbaren", die "nur" zur Berechnung oder in einem Filter (aka WHERE) verwendet werden. Du kannst nur auf Felder zugreifen, die der Datenbankserver kennt; und dazu muss er wissen, in welchen Tabellen er gucken soll. Und das erfährt er NUR über FROM!


    EDITH sagt:

    Die Angabe "FROM TabelleA, TabelleB" ist - in dieser Form isoliert betrachtet - zuerst mal ein Full Outer Join, also ein kartesisches Produkt. Es wird dann dadurch eingeschränkt, dass man - mittels WHERE - die Verknüpfungsbedingungen angibt (WHERE TabelleA.PrimaryKey = TabelleB.ForeignKey).

    Das KANN man tun, und es ist Old School. Soll heißen: Es ist Schwachsinn, weil sich dann in deiner WHERE-Klausel die Verknüfpungsbedingungen mit den "echten" Filterbedingungen (WHERE Kunde.Alter between 18 and 25) vermischen und gar nicht mehr richtig klar ist auf den ersten Blick, was Filter, was Verknüpfung ist.

    Sauberer ist es daher, die Tabellen zu Joinen.

    FROM TabelleA INNER JOIN TabelleB ON TabelleA.PrimaryKey = TabelleB.ForeignKey

    So ist auf einen Blick ersichtlich, WIE die Tabellen verknüpft sind.
    Geändert von WITM55 (25.07.2008 um 10:06 Uhr)
    Beste Grüße,
    WITM55

    sicherer E-Mail-Kontakt: Über den Schlüssel 3DE6FF44 (zum Beispiel über Server http://wwwkeys.de.pgp.net/ mit dem Suchstring 0x3DE6FF44 zu beziehen)

    Code:
    BOFH Excuse #227: Fatal error right in front of screen.

  7. #17
    Registriert seit
    07 2008
    Beiträge
    9
    ok jetzt habe ich es geschnallt. Tut mir leid das ich dir soviel arbeit mache aber ich arbeite mit SQL erst seit ca 1 woche...
    ich werd es ändern. Und nochmals Danke für deine Geduld mit mir
    ich denke mal der Thread kann dann geschlossen werden.

  8. #18
    Registriert seit
    12 2007
    Ort
    Südpfalz
    Beiträge
    1.307
    Ahhh, okay, ich sehe schon... 1 Woche...

    Geduld du haben musst, junger Padawan; nicht leicht die Macht kommt!

    Und wenn du noch Fragen hast - meld dich! Über meine Sig findest du meinen E-Mail-Schlüssel (und über den wiederum auch die E-Mail-Adresse). Wenn nicht schick hier eine PN, dann lass ich dir meine Mail-Adresse zukommen.

    P.S.: Ich helf gern, wenn ich kann - freut mich, wenn es dir auch was gebracht hat ;-)
    Geändert von WITM55 (25.07.2008 um 10:46 Uhr)
    Beste Grüße,
    WITM55

    sicherer E-Mail-Kontakt: Über den Schlüssel 3DE6FF44 (zum Beispiel über Server http://wwwkeys.de.pgp.net/ mit dem Suchstring 0x3DE6FF44 zu beziehen)

    Code:
    BOFH Excuse #227: Fatal error right in front of screen.

  9. #19
    Registriert seit
    07 2008
    Beiträge
    9
    So habe heute endlich die Auswertung bekommen und alles ist richtig. Habe auch das geschrieben wegen der resttage berechnung so wie du meintes WITM55...der Leiter hat sich mehrmals dafür entschuldigt und konnte sich auch nicht erklären warum er mir so ein Kommentar dazu geschrieben hat. Es war ihm ziemlich peinlich ....... ^^
    Nochmal ein grosses danke für die Hilfe. Werde mich vielleicht nochmal per Mail an dich wenden wenn ich Fragen hab, aber die Prüfung ist gottseidank erst in 2 Monaten so dass ich bis dahin wohl fit bin in Sachen SQL. somit kann der Thread hier denke ich mal geclosed werden.
    MFG
    Miller

  10. #20
    Registriert seit
    12 2007
    Ort
    Südpfalz
    Beiträge
    1.307
    Hehehe... ich hab schon in der Schule gerne die Lehrer verbessert. (Boah, ich muss ein furchtbarer Schüler gewesen sein, wenn ich so drüber nachdenke...)

    Wie gesagt, gern geschehen. Meld dich ggf. einfach per Mail ;-)

    So, und jetzt viel Spaß beim Lernen - und vorab schon mal Toi, Toi, Toi für die Prüfung!
    Beste Grüße,
    WITM55

    sicherer E-Mail-Kontakt: Über den Schlüssel 3DE6FF44 (zum Beispiel über Server http://wwwkeys.de.pgp.net/ mit dem Suchstring 0x3DE6FF44 zu beziehen)

    Code:
    BOFH Excuse #227: Fatal error right in front of screen.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Brauche Dringend Hilfe
    Von samy8 im Forum Komponenten
    Antworten: 5
    Letzter Beitrag: 23.08.2007, 05:50
  2. Brauche dringend Hilfe
    Von Moon33 im Forum Mobiles
    Antworten: 5
    Letzter Beitrag: 08.08.2006, 18:09
  3. Brauche dringend Hilfe !!
    Von bebob im Forum CPU & RAM
    Antworten: 4
    Letzter Beitrag: 06.12.2005, 16:43
  4. Brauche dringend Hilfe!!
    Von brixx im Forum Windows Clients
    Antworten: 1
    Letzter Beitrag: 28.02.2005, 17:00
  5. UNMOUNTABLE_BOOT_VOLUME?? Brauche Hilfe
    Von andy-b23 im Forum Storage
    Antworten: 1
    Letzter Beitrag: 21.09.2003, 10:33

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •