n° 186
Luglio/Agosto 2013
Giugno 20, 2013, 02:42:00 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Contare utenti con stesso nome e cognome  (Letto 3385 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
rikgesha
Jr. Member
**

Karma: +0/-1
Scollegato Scollegato

Messaggi: 55


Mostra profilo
« inserita:: Novembre 18, 2009, 02:30:12 pm »

Ciao ecco quello che mi servirebbe.
Ho una tabella del tipo:

ID | NOME | COGNOME

Vorrei ottenere il numero degli utenti con stesso nome e cognome.
Registrato
alex.75
invioattach
Full Member
***

Karma: +14/-4
Scollegato Scollegato

Messaggi: 341



Mostra profilo WWW
« Risposta #1 inserita:: Novembre 18, 2009, 03:20:10 pm »

Questa query ti è comoda per trovare duplicati, spero sia quello che intendevi.

Codice:
select nome, cognome, COUNT(id) as numero
From Test_1
group by nome, cognome
having COUNT(id) > 1
order by numero desc;

Ciao
Alessandro
Registrato
genio88
Newbie
*

Karma: +1/-0
Scollegato Scollegato

Messaggi: 26


Mostra profilo E-mail
« Risposta #2 inserita:: Novembre 18, 2009, 05:46:02 pm »

Questa dovrebbe andare comunque bene,ma l'ID è unico?

Codice:
SELECT U1.id,U2.id
FROM Utente AS U1,Utente AS U2
WHERE U1.nome=U2.nome AND U1.cognome=U2.cognome

Così ottieni gli id degli utenti che hanno lo stesso nome e cognome,ma cosa ti serve di preciso?
Registrato
rikgesha
Jr. Member
**

Karma: +0/-1
Scollegato Scollegato

Messaggi: 55


Mostra profilo
« Risposta #3 inserita:: Novembre 19, 2009, 02:47:27 pm »

Grazie per le risposte.
Praticamente io in questa tabella tra tutti gli utenti che hanno stesso nome e cognome devo lasciarne uno solo.
Faccio un esempio:

ID | NOME | COGNOME | MAIL

1  | Paolo  |  Rossi  |  paolorossi@sito.it
2  | Maria  |  Verdi  |  mariaverdi@maria.it
3  | Paolo  |  Rossi  |  rossi@paolo.it
4  | Gino   | Bianchi | gino@bianchi.it
5  | Maria  | Verdi    |  maria65@libero.it


Deve eliminare i doppioni e lasciare il primo, cioè:

ID | NOME | COGNOME | MAIL

1  | Paolo  |  Rossi  |  paolorossi@sito.it
2  | Maria  |  Verdi  |  mariaverdi@maria.it
4  | Gino   | Bianchi | gino@bianchi.it


Il problema è che non so come fare...

Registrato
alexg
Jr. Member
**

Karma: +2/-0
Scollegato Scollegato

Messaggi: 66


Mostra profilo
« Risposta #4 inserita:: Novembre 19, 2009, 03:13:45 pm »

Ciao rikgesha,
al posto di inserire gli utenti e poi cercare i doppioni, sarebbe meglio implementare un controllo che impedisca l'inserimento di un nominativo già esistente.

Non so in che ambito tu utilizzi l'SQL, se da Java, JSP, C/C++, PHP, VisualBasic, Delphi...ma in linea di massima una volta che hai prelevato l'input dall'utente, generi la query che ti ho scritto come esempio e la esegui.

Query di esempio:
Codice:
SELECT COUNT(*) AS N FROM NOMI WHERE NOME="MARIO" AND COGNOME="ROSSI"

Se il valore N che ti ritorna è 0, vuol dire che non esiste un nominativo del genere e puoi procedere all'inserimento senza doppioni. Se invece N>0 vuol dire che esiste già qualcuno con quel nome e cognome, nel qual caso dovresti informare l'utente che non si possono inserire quei dati perchè già esistenti.

Altrimenti, se ti interessa solamente prelevare un elenco privo di doppioni, da uno già esistente, la cosa più semplice ed immediata è usare il SELECT DISTINCT di SQL.

Eccoti un esempio per il tuo caso:
Codice:
SELECT DISTINCT NOME,COGNOME FROM NOMI
Registrato
rikgesha
Jr. Member
**

Karma: +0/-1
Scollegato Scollegato

Messaggi: 55


Mostra profilo
« Risposta #5 inserita:: Novembre 20, 2009, 01:06:14 pm »

Ciao Alex,
prima di tutto ti ringrazio per la risposta.

Il controllo sull'inserimento non è una cosa che mi riguarda. Il mio compito è semplicemente "pulire" il DB nel modo in cui ti ho detto sopra, e per pulire intendo proprio "eliminare", quindi il DISTINCT non mi serve.

Mi puoi aiutare per l'eliminazione? Ho bisogno di una query efficiente e veloce...

Grazie a tutti
Registrato
alex.75
invioattach
Full Member
***

Karma: +14/-4
Scollegato Scollegato

Messaggi: 341



Mostra profilo WWW
« Risposta #6 inserita:: Novembre 20, 2009, 06:00:01 pm »

Tre metodi possibili che mi vengono in mente.

1) Implementi una Delete dove inserisci nella condizione Where la Select che ti legge i record doppioni ma non il primo di questi, oppure il contrario.

2) Non applicabile (non credo, ma non sono sicuro) se l'id è referenziato da campi di altre tabelle e se è autoincrementale.
Metti in una tabella temporanea (#tmp_univoci: http://databases.aspfaq.com/database/should-i-use-a-temp-table-or-a-table-variable.html) i record univoci ottenuti da una select ad-hoc.
Vuoti la tabella iniziale (comando Drop o Truncate o Delete).
Riempi la tabella con i record della tabella temporanea.

3) Una terza via (e forse la più diretta-corretta) potrebbe essere quella di scorrere con un cursore (CURSOR) la tabella originale.
Inseriendo in una tabella temporanea gli id dei record univoci, ovvero SE questo id non vi è già stato aggiunto.
Quindi, si può procedere alla cancellazione dei record corrispondenti ad id NON presenti (tranne quelli aggiunti dopo l'inizio dell'operazione, magari tenendo memorizzato in una variabile il massimo id presente in tabella finora).

Purtroppo non ho il tempo di provare, ma io sarei partito da queste idee per "pulire" la tabella dai nominativi doppione.
Non so se puoi usare stored procedure ne se le tabelle locali e/o globali sono possibili direttamente nelle query, ne tantomeno i cursori, quindi ti posto un esempio funzionante in una query, anche se mi sembra "mostruosa" per il semplice compito che ha.
Infatti ero partito per ottenere tutti i record univoci.
Forse puoi semplificare il Delete per usare un unica query interna senza usare "UNION" e usando "IN" invece di not IN. 

La Delete che usa una query per ottenere i record evitando quelli considerati doppioni può essere, sarebbe il "contrario" del caso 1):

Codice:
Delete From Test_1 Where id not IN (
select Univoci.id from (

-- record non duplicati
select TA.id, TA.nome, TA.cognome /* T1.*, TA.count */
From Test_1 TA
inner join (
select nome, cognome, COUNT(id) as count
From Test_1
group by nome, cognome
having COUNT(id) = 1   -- no doppioni
) as T1 on T1.nome = TA.nome and T1.cognome = TA.cognome

UNION

-- solo primo record (id minore) dei duplicati
Select T3.id, TA.nome, TA.cognome
From Test_1 TA
inner join (
select Min(id) as id
From Test_1 Tid
join (
select T4.nome, T4.cognome, COUNT(T4.id) as count
From Test_1 T4
group by T4.nome, T4.cognome
having COUNT(T4.id) > 1  -- con doppioni
) as TD on TD.nome = Tid.nome and TD.cognome = Tid.cognome
group by Tid.nome, Tid.cognome
) as T3 on T3.id = TA.id

) as Univoci
)


Ciao
Alessandro
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page