Thomas: Tabellen vergleichen

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

  1. 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

    1. 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.

      1. 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.

      2. 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

        1. in der gleichnamigen 'top100' wo auch Interpret blabla drin sind

          also die selbe

        2. 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

          1. yo,

            mach aus:

            KW =10 OR KW =11

            das:

            alt.kw=10 OR neu.kw=11

            Ilja

            1. nun hat er den Befehl angenommen nur muesste wie gesagt das Jahr noch mit rein...

              1. 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

                1. 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

                  1. 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

                    1. 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

                      1. 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

                        1. Ok ueberredet, kann aber was dauern ich muss um 18:30 Uhr zum Zahnklempner

                        2. 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;

                          1. 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

                            1. 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

                              1. 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

                                1. 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

                                2. 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

                                3. 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

                                4. 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

                                  1. 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

                                    1. yo,

                                      FERTIG

                                      nah gratulation ;-)

                                      Ilja

                                      1. 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;

                            2. Testdatenbank ist angelegt , ich geh mal "eben" zum Zahnarzt

        3. 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