tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Kalito
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
314
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hallo,

    ich habe folgendes Problem:

    In einer Schulklasse werden die Schulnoten eines jeden Schülers gespeichert. Ich möchte nun eine Abfrage machen, die mir innerhalb einer Zeitspanne die LETZTE SCHLECHTESTE Schulnote alle Schüler raussucht. Jede Zeile entspricht einer Schulnote eines bestimmten Schülers an einem bestimmten Tag. Somit können an einem Tag auch mehrere Schulnoten für einen Schüler eingetragen sein.

    Ich würde es wie folgt lösen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    SELECT
        x1.schueler_id,
        x1.maxdate,
        MAX(x2.note) as maxnote
    FROM
        (SELECT
            schueler_id,
            MAX(datum) AS maxdatum
        FROM
            schulnoten
        WHERE
           datum BETWEEN (DATE ( '2011-11-01' ) - INTERVAL '2 weeks') AND '2011-11-01'
        GROUP BY
            schueler_id) x1
    INNER JOIN
        schulnoten x2
    ON
        x1.schueler_id = x2.schueler_id
    AND
        x1.maxdate = x2.datum
    GROUP BY
        x1.schueler_id,
        x1.maxdate

    Kann ich dieses Statement nun irgendwie umformulieren, dass ich das selbe Ergebnis auch OHNE join bekomme? Das Statement wird noch sehr groß, da mehrere Zeiträume miteinander verrechnet werden müssen. Das würde der Übersichtlichkeit helfen und vllt sogar der Performance.

    Ich nutze Postgres.

    Gruß, Tommy
     

  2. #2
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    Ich werde gerade nicht so schlau, was du möchtest. Du willst von jeden Schüler die schlechteste Note in einem bestimmten Zeitraum haben oder? Dabei kann diese ja auch mehrmals auftauchen.

    Naja, mit dem Join machst du eine Referenz auf die selbe Tabelle. Du vergleichst sie mit sich selber, was ab und zu Vorteile bringt, welchen ich aber hier nicht sehe.

    Gruß
     
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  3. #3
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hallo,

    ich suche die LETZE Note in einem bestimmten Zeitraum, und wenn an dem Tag mehrere Noten vorliegen, die SCHLECHTESTE von denen.

    Gruß
     

  4. #4
    Kalito Kalito ist offline Mitglied Brokat
    Registriert seit
    Aug 2010
    Ort
    Leipzig
    Beiträge
    380
    Mit bissel testen müsste es so klappen

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    SELECT
        schueler_id, MAX(datum) AS Datum, MAX(schulnote) AS Note
    FROM
        schulnoten
    Where
        Datum BETWEEN SUBDATE('2011-11-01',INTERVAL 14 DAY) AND '2011-11-01'
     
    GROUP BY schueler_id

    Hatte mir eine Testtabelle gemacht. Kann also sein, das du die Bezeichnungen anpassen musst
    Tommy57 bedankt sich. 
    Ich bin keine Signatur! - Auch wenn`s so aussieht :) - Wirklich!

    Über ein Danke freut sich jeder

  5. #5
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hi Kalito,

    dein Statement gibt mir das letzte Datum und die schlechteste Schulnote. Unter Umständen kriege ich ne zusammengewürfelte Zeile. Ich brauche aber die Schulnote am letzten Schultag und für den Fall, dass am letzten Schultag mehrere Schulnoten vorliegen, die schlechteste von denen.

    Beispiel

    1; 2011-10-21; 1
    1; 2011-10-22; 3
    1; 2011-10-22; 5
    1; 2011-10-24; 4
    1; 2011-10-25; 6
    1; 2011-10-28; 2
    1; 2011-10-28; 4

    So wäre das gesuchte Ergebnis die letzte Zeile. Dein Statement würde mir die vorvorletzte Zeile und die letzte Zeile zusammenschmeißen.

    Gruß
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Der JOIN den du bereits hast ist mMn die beste Lösung.

    ggf. Kann man das mit dem 'da mehrere Zeiträume miteinander verrechnet werden müssen' noch etwas verbessern wenn ich da mehr drüber wüsste wie das gemeint ist.
    Tommy57 bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  7. #7
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Hi Yaslaw,

    ich habe mich für folgende Variante entschieden:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    ... x1
    INNER JOIN
        (SELECT
            schueler_id,
            note,
            MAX(datum) AS maxdatum
        FROM
            schulnoten
        WHERE
           datum BETWEEN (DATE ( '2011-11-01' ) - INTERVAL '2 weeks') AND '2011-11-01'
        GROUP BY
            schueler_id,
            note
        ORDER BY
            note DESC
        LIMIT 1) x2
    ON
        x1.schueler_id = x2.schueler_id
    ...

    Es werden halt mehrere Intervalle verrechnet und das wird n Monster Statement, wo man später einfach jede Übersicht verlieren wird.

    Danke euch beiden!

    Gruß
    Geändert von sheel (15.01.12 um 11:38 Uhr) Grund: Codetags
     

Ähnliche Themen

  1. Ausblenden von Spalten in einer SELECT-Abfrage trotz "SELECT *"
    Von Greq im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 19.11.07, 23:29
  2. select-box1 ändern -> select-box2 nimmt selben wert na
    Von The_MACman im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 15.06.06, 00:34
  3. Select Inhalt und Sichtbarkeit abhängig von vorhergehendem Select
    Von LongDonJohn im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 07.04.06, 12:01
  4. Antworten: 8
    Letzter Beitrag: 18.05.05, 15:43
  5. neues Select nach select aus mysql
    Von mrbong im Forum PHP
    Antworten: 15
    Letzter Beitrag: 14.10.04, 00:05