Tabellen vergleichen
Thomas
- datenbank
Ich hab da folgendes Problem
ich habe 1 Tabelle in der sich die Top100 befindet, nun möchte ich die Interpreten mit dem Album der vorwoche mit der derzeitigen vergleichen um heraus zu finden welches Album von welchem Interpreten diese Woche aus der KW raus ist.
Struktur wäre
Interpret, Album, KW, Jahr, Platz aussteiger
Es wäre nicht schlecht dieses mit einem Update Befehl zu bewerkstelligen um bei dem jeweiligen Album in die Spalte 'aussteiger' ein raus zu setzen....
um die Platzierung der Vorwoche zu vergleichen benutze ich folgendes was auch klappt, nur bekomme ich das nicht umgeschrieben
UPDATE alben AS a,
alben AS b SET a.VW = b.Platz WHERE a.KW = b.KW +1 AND a.Jahr = b.Jahr AND a.album = b.album AND a.KW = 11 AND a.Jahr =2004
Ich denke mal LEFT JOIN sollte es zu bewerkstelligen sein.
Hier mal ein Beispiel was ich erstellt habe....
nur hier wird die aktuelle Kalenderwoche mit der vorigen Kalenderwoche verglichen und die Plätze verglichen, kann mir das jemand umschreiben sodas die Interpreten mit dem dazu gehörigen Titel (Vorwoche mit aktueller Wohe) verglichen werden und nur die ausgeworfen werden die in der aktuellen nicht mehr dabei sind ????
SELECT a.Titel, a.Platz, b.Platz as VWP FROM top100 as a LEFT JOIN top100 AS b ON a.KW=b.KW+1 AND a.Jahr=b.Jahr AND a.Titel=b.Titel
WHERE a.KW=09 AND a.Jahr=2001
yo,
ich habe ein wenig schwierigkeiten, deine situation einzuschätzen. kannst du mal die tabellen aufzeigen, die eine rolle spielen, sprich name und struktur und dann was du genau machen willst, vielleicht noch mal in anderen worte. irgendwie stehe ich auf dem schlauch...
Ilja
Ich pflege eine Tabelle in der die aktuellen Top100 Charts drin sind.
Interpret, Titel, Platz, KW, Jahr
nun möchte ich die vorhergehende Kalenderwoche (derzeit KW 10) mit der aktuellen vergleichen (KW 11 mit KW 10) verglichen werden soll
Interpret mit Titel
Beispiel :
Oomph Augen Auf
derzeit auf Platz 1
so nun möchte ich das die Abfrage alle 100 Interpreten der Vorwoche KW 10 mit der aktuellen vergleicht (KW 11) und mir die Interpreten mit den dazu gehörigen Titeln auswirft die in Kalenderwoche 11, also der aktuellen NICHT mehr drin sind.
Die Abfrage wäre nicht schlecht wenn sie in die Spalte aussteiger ein 'raus' reinsetzen würde, für die Interpreten in der Kalenderwoche 10, die NICHT mehr in Kalenderwoche 11 in den Charts sind.
um es schlichtweg auf einen Punkt zu bringen
vergleiche Kalenderwoche 10 mit Kalenderwoche 11
und werfe mir aus welcher Interpret mit welchen Titel NICHT mehr in Kalenderwoche 11 dabei ist, also ausgestiegen ist.
yo,
versuch mal:
SELECT alt.interpret, alt.titel from top100 as alt LEFT join top100 as neu
ON (alt.interpret=neu.interpret AND alt.titel=neu.titel)
WHERE (KW=10 OR KW=11) AND neu.interpret IS NULL;
Die Abfrage wäre nicht schlecht wenn sie in die Spalte aussteiger ein 'raus' reinsetzen würde, für die Interpreten in der Kalenderwoche 10, die NICHT mehr in Kalenderwoche 11 in den Charts sind.
in welcher tabelle gibt es den die spalte, wo 'raus' rein soll und wie heisst di spalte ?
Ilja
in der gleichnamigen 'top100' wo auch Interpret blabla drin sind
also die selbe
Da kommt ein Fehler bei der ABfrage
SELECT alt.interpret, alt.titel
FROM top100 AS alt
LEFT JOIN top100 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel )
WHERE (
KW =10 OR KW =11
) AND neu.interpret IS NULL
LIMIT 0 , 30
#1052 - Column: 'KW' in where clause is ambiguous
yo,
mach aus:
KW =10 OR KW =11
das:
alt.kw=10 OR neu.kw=11
Ilja
nun hat er den Befehl angenommen nur muesste wie gesagt das Jahr noch mit rein...
yo,
nun hat er den Befehl angenommen nur muesste wie gesagt das Jahr noch mit rein...
einfach mit AND in der WHERE klausel dazufügen:
AND alt.jahr=hier_jahr_eintragen AND neu.jahr=hier_jahr_eintragen
mach mal aus dem einem OR ein AND...
Ilja
Also diese Abfrage
SELECT alt.interpret, alt.titel
FROM top100 AS alt
LEFT JOIN top100 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel )
WHERE ( alt.KW =10 AND neu.KW =11 AND alt.jahr=2004 AND neu.jahr=2004)AND neu.interpret IS NULL;
bringt mir keinerlei Ergebnisse
yo,
bringt mir keinerlei Ergebnisse
dann müssen wir ein wenig "trial on error" versuchen, wobei das nicht gerade von wissen zeugt, aber egal. mach mal folgendes, lass die komplette WHERE klausel weg und schau, ob du eine ausgabe bekommst. wenn ja, dann fügst du eine nach der anderen dazu. also anfang mit:
SELECT alt.interpret, alt.titel
FROM top100 AS alt
LEFT JOIN top100 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel)
dann zweites mit zusätzlich
WHERE alt.KW =10 AND neu.KW =11
und dann
AND alt.jahr=2004 AND neu.jahr=2004
und das zum schluss
AND neu.interpret IS NULL;
schau mal welche ergebnisee du bekommst, damit wir den fehler finden.
Ilja
Oki kein Problem nur wird das ein Problem werden wenn keine KW dabei ist weil ic die Top100 von 12 Jahren habe also run 69000 Datensaetze
wie lange soll da die Abfrage dauern ???
Ich habe zwar zwei 1100 NHZ Prozis im Server aber selbst da wird es eine Ewigkeit dauern
yo,
Oki kein Problem nur wird das ein Problem werden wenn keine KW dabei ist weil ic die Top100 von 12 Jahren habe also run 69000 Datensaetze
dann machst du eben mal schnelle eine testtabelle mit weniger datensätze und lässt die abfrage dann ablaufen.
create table test (spalten....);
insert into test SELECT * from top100 WHERE jahr=2004;
um das SELECT Statement müssen eventuell klammern, je nach DBMS.
Ilja
Ok ueberredet, kann aber was dauern ich muss um 18:30 Uhr zum Zahnklempner
Folgende bringt keine Ergebnisse
SELECT alt.interpret, alt.titel
FROM top100 AS alt
LEFT JOIN top100 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel )
WHERE alt.KW =10 AND neu.KW =11 AND alt.jahr =2004 AND neu.jahr =2004 AND neu.interpret IS NULL;
yo,
mach mal wieder das OR dorthin, was ich ursprünglich dachte und die klammern rum.
WHERE (alt.KW =10 OR neu.KW =11)
Ilja
keine Ergebnisse -----
SELECT alt.interpret, alt.titel
FROM top100 AS alt
LEFT JOIN top100 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel )
WHERE (
alt.KW =10 OR neu.KW =11
) AND alt.jahr =2004 AND neu.jahr =2004 AND alt.interpret IS NULL LIMIT 0 , 30
yo,
lass mal sehen, was die ergebnisse mit der testdatenbank bringen, um den fehler einzugrenze. das ist ja wie mit rate mal mit rosenthal... ;-)
machmal ist es gut abstand von dem computer zu nehmen und neu zu überdenken.
Ilja
keine Ergebnisse -----
SELECT alt.interpret, alt.titel
FROM top100 AS alt
LEFT JOIN top100 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel )
WHERE (
alt.KW =10 OR neu.KW =11
) AND alt.jahr =2004 AND neu.jahr =2004 AND alt.interpret IS NULL LIMIT 0 , 30
Bin zurueck
so diese Abfrage
SELECT alt.interpret, alt.titel
FROM top100 AS alt
LEFT JOIN top100 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel)
liefert mir alle Titel in 5 facher Ausgabe
sprich :
Ich habe 5 KW's in der Testdatenbank nun bringt mir diese Abfrage
5 * Oomph Platz 1
5 * Gigi D'Agostino Platz 2
blabla
SELECT alt.interpret, alt.titel
FROM top1002 AS alt
LEFT JOIN top1002 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel )
WHERE alt.KW =10 AND neu.KW =11
bringt 100 Datensaetze also eine KW
SELECT alt.interpret, alt.titel
FROM top1002 AS alt
LEFT JOIN top1002 AS neu ON ( alt.interpret = neu.interpret AND alt.titel = neu.titel )
WHERE ( alt.KW =10 OR neu.KW =11 ) AND neu.interpret IS NULL;
keine ergebnisse
Kann man das umstricken diese Abfrage wirft mir in der aktuellen KW die Neueinsteiger raus vergleicht also KW 11 mit KW 10
jetzt muesste KW 10 mit KW 11 verglichen werden
SELECT a.Titel, a.Platz, b.Platz AS VWP
FROM top1002 AS a
LEFT JOIN top1002 AS b ON a.KW = b.KW +1 AND a.Jahr = b.Jahr AND a.Titel = b.Titel
WHERE a.KW =11 AND a.Jahr =2004 AND b.Interpret IS NULL LIMIT 0 , 30
FERTIG
SELECT b.Titel, a.Titel, a.Platz, b.Platz AS VWP
FROM top1002 AS a
LEFT JOIN top1002 AS b ON a.KW = b.KW -1 AND a.Titel = b.Titel
WHERE a.KW =10 AND a.Jahr =2004 AND b.Interpret IS NULL LIMIT 0 , 30
yo,
FERTIG
nah gratulation ;-)
Ilja
Und hier die Abfrage zum updaten des Datensatzes
update top100 as a
left join top100 as b
on a.KW = b.KW -1 AND a.Titel = b.Titel AND a.Interpret = b.Interpret
set a.aussteiger = 'raus'
where a.KW =04 AND a.Jahr =2004 AND b.Interpret IS NULL;
Testdatenbank ist angelegt , ich geh mal "eben" zum Zahnarzt
Aehh ich vergas, das Jahr muss noch mit berücksichtig werden da ich die Charts seit 1992 habe also nuesste derzeit noch Jahr 2004 mit rein