[MySQL 3.23.X] Fragen zu Update (kompliziert)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL 3.23.X] Fragen zu Update (kompliziert)

    Frage1:

    Ich will alle 24 h über ein Script (kein Problem) die Plätze der User nach Postpunkten aktuallisieren. Dazu habe ich 3 Spalten in meiner mysql Tabelle (user, posts, rang)

    Also mal ein Beispiel mit 4 Usern:

    Code:
    user | posts | rang
    
    aaaa | 22222 | 4 (alt)
    bbbb | 33333 | 2 (alt)
    cccc | 44444 | 3 (alt)
    dddd | 55555 | 1 (alt)
    Des wäre jetzt die alte Tabelle.

    Jetzt soll Sie geordnet werden und die Spalte "rang" soll korrigiert werden, also:

    Code:
    user | posts | rang
    
    aaaa | 22222 | 4 (neu)
    bbbb | 33333 | 3 (neu)
    cccc | 44444 | 2 (neu)
    dddd | 55555 | 1 (neu)
    Ich will das ganze aber nicht per Select ... Order by posts DESC + Update machen, sondern des ganze in den Update Befehl packen. geht das und wenn ja wie?


    Frage2:

    Also Follgendes:

    - Ich habe eine user Tabelle:

    Code:
    id | nick | wert
    1  | hans | (leer)
    2  | alex | (leer)
    - Ich hab auch eine werte tabelle:

    Code:
    id | userid | w1 | w2
    1  | 1      | 45 | 54
    2  | 1      | 36 | 12
    3  | 2      | 75 | 2
    4  | 1      | 21 | 5
    Kann ich jetzt in einem Update Befehl die Werte (w1*3+w2*5) des Users "1" zusammenrechnen und die die Spalte user.wert einfügen?
    Also so:

    Code:
    id | nick | wert
    1  | hans | 102
    2  | alex | 75
    Wenn ja, wie bekomm ich sowas hin? Ich hab schon bissle mit Group by probiert, aber des geht irgendwie net in UPDATE.

    Mein Versuch:
    PHP-Code:
    <?php 
    $aendern 
    "Update user Left Join werte on werte.userid=user.id Set user.werte=(werte.w1*3)+(werte.w2*5)";
    mysql_query($aendern);
     
    ?>
    Dabei wird aber immer nur der erste Eintrag der werte Tabelle berücksichtigt.

    P.s.: Ich weiß, dass ich die Werte in die werte Tabelle auch gleich multiplizieren köntte, aber das geht in meinem etwas komplizierterem Fall nicht

  • #2
    (wenn ich jetzt nicht ganz falsch bin)

    evtl. über subselects, aber erst in der neueren version.

    Kommentar


    • #3
      Meinst du, dass man Frage 2 mit Subqueries lösen kann oder beide?
      Weil Frage 2 kann ich verstehen, aber Frage1?

      Dann gibt es noch des Problem, dass ich kein mysql 4.1 hab
      Gibt es evtl. noch andere Möglichkeiten?

      Kommentar


      • #4
        Hallo!
        Ohne Subquery kannst Du in diesem Fall mit Update nichts machen.
        Für eine Lösung im SQL muss dann eine temporäre Tabelle her:

        drop table if exists tmp;
        -> Tabellenstruktur übernehmen:
        create table tmp select * from tab1 limit 0;
        -> Neue Spalte:
        alter table tmp add column rangneu integer not null default 0 auto_increment, add primary key(rangneu);
        -> Alle Daten in die temporäre, rangneu wird automatisch gefüllt
        insert into tmp(user,posts,rang) select user,posts,rang from tab1 order by posts desc;
        -> Alle Daten vom tmp in die "alte" zurück, Voraussetzung: primary key
        (bei delete und insert into Datenverlust bei Abbruch möglich)
        replace into tab1 (user,posts,rang) select user,posts,rangneu from tmp;

        [Edit]
        Gilt auch für Frage 2

        Kommentar

        Lädt...
        X