Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [MySQL] Impostare valori crescenti con unico update

    Ho una tabella in cui i record hanno un campo "points" e uno "position" (in pratica è una classifica). Io dovrei assegnare le varie posizioni dalla 1 alla n in base ai punti. E' possibile farlo con una sola query senza passeggiare con php?

    Ovvero: posso scrivere qualcosa al posto di "{magia}" in modo che i record assumano i valori 1, 2, 3, 4, ...?
    codice:
    UPDATE photos SET position={magia} WHERE contest_id=$id ORDER BY points DESC
    Thanks

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    La posizione è un campo calcolato e in quanto tale non lo devi memorizzare nel database ma lo calcolerai in base al punteggio quando ti servirà.

    Dai uno sguardo a questo vecchio thread.

    http://forum.html.it/forum/showthrea...t=intelligenti

  3. #3
    Grazie per il suggerimento
    Però preferirei calcolare la posizione e poi salvarla visto che è da fare una volta sola, in modo da risparmiare carico al server
    Immagino che usando un @posizione potrei impostare il valore di ogni campo, mi rimane da capire come incrementare @posizione ad ogni record, non sapevo nulla sui cursori fino a 2 minuti fa

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    I cursori sono un'altra cosa.
    Vuoi un metodo di numerazione come quello che serviva a me, cioè che tenga conto dei pari merito?

  5. #5
    Sarebbe perfetto

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Ti posto un esempio

    codice:
    create table posizioni (
    id int not null auto_increment,
    nome char(1),
    punti int,
    posizione int,
    primary key (id)
    ) engine=myisam
     
    
    insert into posizioni (nome,punti)
    values
    ('a',2),
    ('b',7),
    ('c',3),
    ('d',9),
    ('e',10),
    ('f',8),
    ('g',9),
    ('h',7),
    ('i',6),
    ('l',3)
     
     
     
    set @riga = 0, @posizione = 0, @preced = 0;
    update posizioni as p inner join
    (select id,@riga := @riga + 1 as riga, nome,
    @posizione := if(@preced<>punti,@riga,@posizione) as posizione,
    @preced := punti as punti
    from posizioni order by punti desc) as t
    on p.id = t.id
    set p.posizione = t.posizione
    
    
    select * from posizioni order by posizione
    Comunque eviterei di memorizzare la posizione in tabella, poi decidi tu.

  7. #7
    Originariamente inviato da nicola75ss
    Ti posto un esempio

    codice:
    create table posizioni (
    id int not null auto_increment,
    nome char(1),
    punti int,
    posizione int,
    primary key (id)
    ) engine=myisam
     
    
    insert into posizioni (nome,punti)
    values
    ('a',2),
    ('b',7),
    ('c',3),
    ('d',9),
    ('e',10),
    ('f',8),
    ('g',9),
    ('h',7),
    ('i',6),
    ('l',3)
     
     
     
    set @riga = 0, @posizione = 0, @preced = 0;
    update posizioni as p inner join
    (select id,@riga := @riga + 1 as riga, nome,
    @posizione := if(@preced<>punti,@riga,@posizione) as posizione,
    @preced := punti as punti
    from posizioni order by punti desc) as t
    on p.id = t.id
    set p.posizione = t.posizione
    
    
    select * from posizioni order by posizione
    Comunque eviterei di memorizzare la posizione in tabella, poi decidi tu.
    Perchè? Nel mio caso si tratta della classifica di un contest fotografico, quindi le posizioni sono da calcolare solo una volta alla chiusura delle votazioni

    Un dubbio: se devo inserire una WHERE nell'update dove devo metterla? Devo filtrare le foto per contest_id

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Metti il where all'interno della select come faresti in qualsiasi altra query.

  9. #9
    Grazie mille

    Non ho mai fatto più query in una, questo potrebbe funzionare?
    Codice PHP:
    $query=<<<EOF
    SET @riga = 0, @posizione = 0, @preced = 0, @winning_photo_id = 0, @winning_user_id = 0;
    UPDATE photos p
        INNER JOIN 
            (SELECT 
                id, 
                @riga := @riga + 1 AS riga, 
                @posizione := IF(@preced<>points, @riga, @posizione) AS position, 
                @preced := points AS points 
             FROM photos
             WHERE contest_id=
    $id
             ORDER BY points DESC) AS t
        ON p.id = t.id
        SET p.position = t.position
        WHERE contest_id=
    $id;

    SELECT id AS @winning_photo_id, user_id AS @winning_user_id FROM photos WHERE contest_id=
    $id ORDER BY position ASC LIMIT 1;

    UPDATE contests
        SET
            status='Concluso',
            winning_photo=winning_photo_id
        WHERE
            id=
    $id;

    UPDATE users
        SET
            victories = victories+1
        WHERE
            id=winning_user_id;
    EOF; 

  10. #10
    Mi dà un errore che non capisco:
    codice:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE photos p
        INNER JOIN 
            (SELECT 
                id, 
                @r' at line 2
    Inoltre nella guida leggo questo: "Currently, you cannot update a table and select from the same table in a subquery."
    C'entra qualcosa?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.