Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Select-Abfrage, die nur einen leeren Datensatz liefert

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Markus92, 2 Juni 2014.

  1. Markus92

    Markus92 Aktiver Benutzer

    Hallo,

    Ich habe folgende SQL-Abfrage erstellt:
    Code:
    select c.datum, d.datum, wahlparteiname.name, (b.stimmen*100/(d.abgegebene-d.ungueltige))-(a.stimmen*100/(c.abgegebene-c.ungueltige)) as difference from wahl c inner join wahlpartei a on a.wahlid=c.id left outer join wahlparteiname on wahlparteiname.id=a.wahlparteinameid left outer join wahlpartei b on b.wahlparteinameid=wahlparteiname.id inner join wahl d on b.wahlid=d.id where c.id=d.id-1 and d.id=1
    wenn ich and d.id=1 weglasse werden mir ergebnisse angezeigt, nur die mit c.datum=NULL und d.datum=1.datum nicht, was muss ich ändern, um auch dieses zu erhalten?

    Gruß Markus
     
  2. Markus92

    Markus92 Aktiver Benutzer

    Die Abfrage soll die differenz je wahlparteiname.name pro 2 aufeinanderfolgende wahl.id darstellen. leider wird wie oben beschreiben die erste, die keinen vorgänger hat nicht dargestellt, außerdem werden nur wahlparteiname dargestellt, die in beiden wahl.id vorhanden sind.
     
  3. ukulele

    ukulele Datenbank-Guru

    1. Ist die Abfrage ziemlich komplex und kaum verständlich ohne die Tabellen zu kennen.
    2. Deine Frage ist schwer verständlich.
    Dann gibt es wohl kein Ergebniss bei dem d.id = 1 ist.
    Da c.datum und d.datum nur im Select-Teil stehen und nicht als Where-Bedingung oder in einem der vielen Joins stehen muss das an anderen Spalten liegen als an c.datum oder d.datum. Die werden nur angezeigt.
    Herausfinden, was diese Daten von den angezeigten unterscheidet.
     
  4. Markus92

    Markus92 Aktiver Benutzer

    Mal die Create Tables zum besseren verständnis:
    Code:
    create table wahl (
    id int auto_increment primary key,
    ungueltige int,
    abgegebene int,
    datum date
    );
    create table wahlparteiname(
    id int auto_increment primary key,
    name int
    );
    create table wahlpartei(
    id int auto_increment priamary key,
    stimmen int,
    wahlid int,
    wahlparteinameid int,
    foreign key (wahlid) references wahl(id) on delete cascade,
    foreign key(wahlparteinameid) references wahlparteiname(id) on delete cascade
    )
     
  5. Markus92

    Markus92 Aktiver Benutzer

    Ich möchte eine Abfrage, die für jede Partei, die Veränderung im Vergleich zur vorherigen Wahl (auch wenn vorher nicht angetreten oder jetzt nicht mehr angetretten) angibt. wahltypid und landid müssen für die vorherige wahl und die jetztige wahl übereinstimmen. Der select scheint sehr kompliziert zu werden und ich weis nicht, wie ich ihn ansetzten soll, habe schon etliches versucht. danke für eure hilfe
     
  6. ukulele

    ukulele Datenbank-Guru

    Eigentlich dürfte das, abgesehen davon das viel gejoint werden muss, nicht so schwer sein. Sofern die Vorgängerwahl ID immer um genau 1 kleiner ist als die Nachfolger ID, sonst musst du ähnlich verfahren wie in deinem anderen Post.

    Wichtig ist hier der FULL OUTER JOIN um erstmal die beiden Wahlen zu holen und NULL Werte auf beiden Seiten zu bekommen:
    Code:
    SELECT    left_w.id,
            left_w.datum
            right_w.id,
            right_w.datum
    FROM    wahl left_w
    FULL OUTER JOIN wahl right_w
    ON        left_w.id = right_w.id - 1
    Dannach kannst du alle Zusatzinformationen durch JOINs holen:
    Code:
    SELECT    left_n.name,
            left_w.id,
            left_w.datum,
            left_z.stimmen,
            right_w.id,
            right_w.datum,
            right_z.stimmen
    FROM    wahl left_w
    FULL OUTER JOIN wahl right_w
    ON        left_w.id = right_w.id - 1
    LEFT JOIN wahlpartei left_z
    ON        left_w.id = left_z.wahlid
    LEFT JOIN wahlparteiname left_n
    ON        left_z.wahlparteinameid = left_n.id
    LEFT JOIN wahlpartei right_z
    ON        right_w.id = right_z.wahlid
     
  7. Markus92

    Markus92 Aktiver Benutzer

    Erstmal danke für die Hilfe.
    Ich sehe da 2 Probleme:
    Zum einen kann mysql keinen full outer join und zum anderen ist es nicht immer die um 1 kleinere id, sondern für wahltypid und landid gleich die ids gehören alle zusammen. Das kommt vor allem dann zum tragen, wenn ich neue Wahlen Eintrage, da die DB für Bundestag, Europa und Landtag sein soll.
     
  8. Markus92

    Markus92 Aktiver Benutzer

    Ich habe nun eine Lösung gefunden:
    Code:
    SELECT    left_n.name,
            left_w.id,
            left_w.datum,
            left_z.stimmen,
            right_w.id,
            right_w.datum,
            right_z.stimmen
    FROM    wahl left_w
    left OUTER JOIN wahl right_w
    ON        left_w.id = right_w.id - 1 and left_w.wahltypid=right_w.wahltypid and left_w.landid=right_w.landid
    LEFT JOIN wahlpartei left_z
    ON        left_w.id = left_z.wahlid
    inner JOIN wahlparteiname left_n
    ON        left_z.wahlparteinameid = left_n.id
    left JOIN wahlpartei right_z
    ON        right_w.id = right_z.wahlid and right_z.wahlparteinameid=left_n.id
    union
    SELECT    left_n.name,
            left_w.id,
            left_w.datum,
            left_z.stimmen,
            right_w.id,
            right_w.datum,
            right_z.stimmen
    FROM    wahl left_w
    right OUTER JOIN wahl right_w
    ON        left_w.id = right_w.id - 1 and left_w.wahltypid=right_w.wahltypid and left_w.landid=right_w.landid
    LEFT JOIN wahlpartei left_z
    ON        left_w.id = left_z.wahlid
    inner JOIN wahlparteiname left_n
    ON        left_z.wahlparteinameid = left_n.id
    left JOIN wahlpartei right_z
    ON        right_w.id = right_z.wahlid and right_z.wahlparteinameid=left_n.id
    union
    SELECT    left_n.name,
            left_w.id,
            left_w.datum,
            left_z.stimmen,
            right_w.id,
            right_w.datum,
            right_z.stimmen
    FROM    wahl left_w
    left OUTER JOIN wahl right_w
    ON        left_w.id = right_w.id - 1 and left_w.wahltypid=right_w.wahltypid and left_w.landid=right_w.landid
    LEFT JOIN wahlpartei right_z
    ON        right_w.id = right_z.wahlid
    inner JOIN wahlparteiname left_n
    ON        right_z.wahlparteinameid = left_n.id
    left JOIN wahlpartei left_z
    ON        left_w.id = left_z.wahlid and left_z.wahlparteinameid=left_n.id
    union
    SELECT    left_n.name,
            left_w.id,
            left_w.datum,
            left_z.stimmen,
            right_w.id,
            right_w.datum,
            right_z.stimmen
    FROM    wahl left_w
    right OUTER JOIN wahl right_w
    ON        left_w.id = right_w.id - 1 and left_w.wahltypid=right_w.wahltypid and left_w.landid=right_w.landid
    LEFT JOIN wahlpartei right_z
    ON        right_w.id = right_z.wahlid
    inner JOIN wahlparteiname left_n
    ON        right_z.wahlparteinameid = left_n.id
    left JOIN wahlpartei left_z
    ON        left_w.id = left_z.wahlid and left_z.wahlparteinameid=left_n.id
    
     
  9. Markus92

    Markus92 Aktiver Benutzer

    Einziges Problem ist noch:
     
  10. ukulele

    ukulele Datenbank-Guru

    Dann würde ich es genauso machen wie in deinem anderen Post wo die max(id) per Subselect ausgewählt wird. Bis auf ein paar mehr Joins ist das ja das Selbe.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden