Select-Abfrage, die nur einen leeren Datensatz liefert

Markus92

Aktiver Benutzer
Beiträge
30
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
 
Werbung:
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.
 
1. Ist die Abfrage ziemlich komplex und kaum verständlich ohne die Tabellen zu kennen.
2. Deine Frage ist schwer verständlich.
wenn ich and d.id=1 weglasse werden mir ergebnisse angezeigt
Dann gibt es wohl kein Ergebniss bei dem d.id = 1 ist.
nur die mit c.datum=NULL und d.datum=1.datum nicht
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.
was muss ich ändern, um auch dieses zu erhalten?
Herausfinden, was diese Daten von den angezeigten unterscheidet.
 
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
)
 
create table wahl (
id int auto_increment primary key,
ungueltige int,
abgegebene int,
datum date,
wahltypid int,
landid int
);
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
 
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
 
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.
 
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
 
Einziges Problem ist noch:
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.
 
Werbung:
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.
 
Zurück
Oben