[myslq] problema con update

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
skonvols2k
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 29 marzo 2006, 21:55
Località: Napoli

[myslq] problema con update

Messaggio da skonvols2k »

salve, ho il seguente problema con l'update di mysql:
ho un db con un numero, un titolo e una categoria, mettiamo che una certa categoria vada dal numero 200 al 300.

vorrei aggiornare il numero delle tuple della categoria in modo che rimanga tra 200 e 300 ma seguendo l'ordine alfabetico dato da titolo.

si consideri anche che num è chiave primaria.

vorrei evitare l'uso di php.

GRAZIE
prampa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 652
Iscrizione: lunedì 26 febbraio 2007, 14:04

Re: [myslq] problema con update

Messaggio da prampa »

skonvols2k ha scritto: salve, ho il seguente problema con l'update di mysql:
ho un db con un numero, un titolo e una categoria, mettiamo che una certa categoria vada dal numero 200 al 300.

vorrei aggiornare il numero delle tuple della categoria in modo che rimanga tra 200 e 300 ma seguendo l'ordine alfabetico dato da titolo.

si consideri anche che num è chiave primaria.

vorrei evitare l'uso di php.

GRAZIE
non ho capito cosa ti serve. Fai un esempio cosi' da capire bene il problema.
Evitare php puoi farlo tranquillamente ma nel senso che o fai un update da dentro mysql (se non riesci con un'update  secca ti crei una  procedura o una function memorizzandola in mysql direttamente) oppure usi un altro linguaggio di programmazione. Dipende se ti serve una sola volta oppure piu' volte.
ciao
Avatar utente
skonvols2k
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 29 marzo 2006, 21:55
Località: Napoli

Re: [myslq] problema con update

Messaggio da skonvols2k »

prampa ha scritto:
skonvols2k ha scritto: salve, ho il seguente problema con l'update di mysql:
ho un db con un numero, un titolo e una categoria, mettiamo che una certa categoria vada dal numero 200 al 300.

vorrei aggiornare il numero delle tuple della categoria in modo che rimanga tra 200 e 300 ma seguendo l'ordine alfabetico dato da titolo.

si consideri anche che num è chiave primaria.

vorrei evitare l'uso di php.

GRAZIE
non ho capito cosa ti serve. Fai un esempio cosi' da capire bene il problema.
Evitare php puoi farlo tranquillamente ma nel senso che o fai un update da dentro mysql (se non riesci con un'update  secca ti crei una  procedura o una function memorizzandola in mysql direttamente) oppure usi un altro linguaggio di programmazione. Dipende se ti serve una sola volta oppure piu' volte.
ciao
ciao praticamente ho una situazione simile a questa:
Num  Titolo  Categoria
........................... ecc.
100    bfs      altro
........................... ecc.
200    ACB      prova
201    ABC      prova
........................... ecc.
301    fgd      pippo


vorrei fare un update in modo che gli appartenti alla cat. "prova" siano ordinati in ordine alfabetico e quindi aggiornato il campo "Num", cioè:

Num  Titolo  Categoria
........................... ecc.
100    bfs      altro
........................... ecc.
200    ABC      prova
201    ACB      prova


cioè vorrei fare:
UPDATE db SET Num=????? WHERE Categoria="prova" ORDER BY Titolo

il problema è che non so cosa mettere in ?????

grazie
prampa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 652
Iscrizione: lunedì 26 febbraio 2007, 14:04

Re: [myslq] problema con update

Messaggio da prampa »

questa potrebbe essere una soluzione, anche senza linguaggi di programmazione.

Codice: Seleziona tutto

DELIMITER $$

DROP PROCEDURE IF EXISTS `FP`.`procedura1`$$
CREATE PROCEDURE `procedura1`()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a SMALLINT(5);
  DECLARE b INT default 0;
  DECLARE cur1 CURSOR FOR SELECT id_deco from DECO;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur1;

  REPEAT
   set b = b + 1;
    FETCH cur1 INTO a;
  UNTIL done END REPEAT;

  CLOSE cur1;

END$$

DELIMITER ;
E' una stored procedure e la mandi in esecuzione con call procedura1; da dentro mysql senza utilizzare alcun linguaggio di programmazione e tutte le volte che vuoi.
Allora: per prima cosa una chiave primaria è una chiave e basta, un numero in questo caso, e non puoi utilizzarla per altri scopi. Il suo unico scopo è riconoscere univocamente un'occorrenza nella tabella e a cui deve corrispondere univocamente qualsiasi attrbuto della tabella. Conta che l'aggiornameto di una chiave primaria è in  realtà una cancellazione ed un inserimento e pensa quante cose dovresti verificare, ad esempio la chiave duplicata.
Se hai questa necessità, aggiungi un altro campo, numerico che aggiornerai in base all'ordinamento del titolo nell'ambito della categoria. Se ho capito, ti serve un contatore che, all'interno della categoria ordinando per titolo, o parta da 1 oppure parta dal minore di tutti i numeri collegati alla categoria. In questa stored procedure dovrai cambiare FP con il nome del tuo DB e il nome della procedura (procedura1). Dovrai cambiare la select all'interno del cursore (recuperando solo la chiave primaria ordinando per titolo) in base alle tue esigenze e impostare la variabile "a" con il tipo giusto. La variabile "b" per ora parte da 1, ma puoi impostarci la min(numero) per la categoria, cosi' da partire esattamente con il valore piu' basso. E poi all'interno del ciclo aggiorni il nuovo campo per chiave primaria con il valore di "b". Il nome della categoria potresti fornirla anche da parametro.
Altrimenti potesti anche provare a estrarre tutte le occorrenze della categoria ordinandole per titolo, salvarle in un array, cancellare tutti i numeri associati con la categoria e poi inserire nuovamente leggendo dall'array, avendo avuto l'accortezza di salvarti il numero piu' basso. Cosi' almeno non incorrerai in problemi di chiave duplicata.
Boh....non mi vengono in mente altre soluzioni senza utilizzare un linguaggio di programmazione specifico. Ah, i $$ li devi lasciare cosi come sono perche' gli servono come delimitatore per l'esecuzione.
Ma i numeri collegati con le categorie....sono sempre in sequenza? oppure possono avere numeri anche non contigui? perche' la logica potrebbe anche cambiare....
ciao
Avatar utente
skonvols2k
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 29 marzo 2006, 21:55
Località: Napoli

Re: [myslq] problema con update

Messaggio da skonvols2k »

prampa ha scritto: Altrimenti potesti anche provare a estrarre tutte le occorrenze della categoria ordinandole per titolo, salvarle in un array, cancellare tutti i numeri associati con la categoria e poi inserire nuovamente leggendo dall'array, avendo avuto l'accortezza di salvarti il numero piu' basso. Cosi' almeno non incorrerai in problemi di chiave duplicata.
Boh....non mi vengono in mente altre soluzioni senza utilizzare un linguaggio di programmazione specifico. Ah, i $$ li devi lasciare cosi come sono perche' gli servono come delimitatore per l'esecuzione.
Ma i numeri collegati con le categorie....sono sempre in sequenza? oppure possono avere numeri anche non contigui? perche' la logica potrebbe anche cambiare....
ciao
grazie mille scusami se non è un problema per te potresti accennare anche questa soluzione con l'array?
i numeri sono sempre da un min a un max al più c'è un qualche "buco" nella sequenza.
grazie grazie grazie :)
prampa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 652
Iscrizione: lunedì 26 febbraio 2007, 14:04

Re: [myslq] problema con update

Messaggio da prampa »

non capisco se va bene aggiungendo un campo oppure tu abbia la necessità di aggiornare sempre la chiave primaria. Il numero sequenziale deve partire da 1 oppure dal valore piu' basso del campo "numero" all'interno della categoria? (puoi utilizzare un contatore oppure utilizzare i numeri esistenti?) posta la struttura della tua tabella, per fare delle prove. E' comunque fondamentale sapere se preferisci questo metodo all'uso di un qualsiasi linguaggio che si interfaccia con mysql.
ciao
Avatar utente
skonvols2k
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 29 marzo 2006, 21:55
Località: Napoli

Re: [myslq] problema con update

Messaggio da skonvols2k »

prampa ha scritto: non capisco se va bene aggiungendo un campo oppure tu abbia la necessità di aggiornare sempre la chiave primaria. Il numero sequenziale deve partire da 1 oppure dal valore piu' basso del campo "numero" all'interno della categoria? (puoi utilizzare un contatore oppure utilizzare i numeri esistenti?) posta la struttura della tua tabella, per fare delle prove. E' comunque fondamentale sapere se preferisci questo metodo all'uso di un qualsiasi linguaggio che si interfaccia con mysql.
ciao
vorrei aggiornare la chiave primaria (anche se non è elegante) :)
dal min all'interno della categoria.
vorrei usare mysql e basta.

ecco la struttura:

Campo  Tipo
Num int(3)
Case smallint(2)
Titolo varchar(255)
Anno int(4)
Genere varchar(20)
Stato varchar(25)
Data timestamp
Supporto varchar(6)

si tratta di un db di dvd  ;D
prampa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 652
Iscrizione: lunedì 26 febbraio 2007, 14:04

Re: [myslq] problema con update

Messaggio da prampa »

cosi' funziona

Codice: Seleziona tutto

DELIMITER $$

DROP PROCEDURE IF EXISTS `videoteca`.`prova`$$
CREATE PROCEDURE `prova`(par VARCHAR(250))
BEGIN
  DECLARE a1 INT DEFAULT 0;

  CREATE TABLE appoggio ENGINE=HEAP SELECT * FROM dvd where genere=par;
DELETE FROM dvd where genere = par;
  SELECT min(num)  into a1 from appoggio; 
insert into dvd (num, titolo, genere)
SELECT @a2:=@a2+1 newnum, t.titolo, t.genere
FROM (SELECT @a2:=a1-1) r, appoggio t
order by t.titolo;
 DROP TABLE appoggio;
END$$

DELIMITER ;
al posto di:
- videoteca, imposti il nome del tuo db
- dvd, imposti il nome della tua tabella
- prova, metti il nome della procedura che vuoi

poi da dentro mysql esegui call nomedb.nomeprocedura(nomecategoria);
dove per
- nomedb è il nome del tuo db (oppure ti connetti al db e lo puoi omettere)
- nomeprocedura è il nome della procedura che hai impostato prima
- nomecategoria è il genere

Questa procedura assegna sequenziamente delle nuove chiavi primarie ai titoli partendo dal minore per categoria. La rinumerazione segue l'ordinamento per titolo nell'ambito di una categoria.
Poi devi aggiungere gli altri campi (io ho impostato solo i principali) e magari utilizzare funzioni di porta a maiuscolo o minuscolo sulle query di ricerca dati per genere, perche' cosi' come è ora risulta case sentitive.
Prima di usarlo sul db ufficiale fatti tre belle copie e usalo sulle copie.
ciao
Avatar utente
skonvols2k
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 29 marzo 2006, 21:55
Località: Napoli

Re: [myslq] problema con update

Messaggio da skonvols2k »

grandioso grazie !!! + tardi lo provo e ti faccio sapere.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti