[ Kusur @ 06.03.2004. 16:14 ] @
Pozdrav svima

Php, mysql

Da li neko zna kako da napravim sql upit koji će da mi prikaže duplikate-iste redove iz baze?

Primer:
Upit koji će prikazati samo email-ove i imena korisnika koji imaju isti email.


Rbr.___Email________Ime

1. [email protected] - Petar Petrovic
2. [email protected] - Jovan Jovanovic
3. [email protected] - Milan Mitrovic

itd.

Unapred hvala
[ broker @ 06.03.2004. 17:05 ] @
Grupises slogovre po polju koje proveravas i korsitis funkciju count() da ti prebroji broj slogova u listi. Sve grupe koje imaju vise od jednog sloga sadrze duplikate.
[ noviKorisnik @ 06.03.2004. 19:22 ] @
Code:
SELECT *
FROM korisnici
WHERE email IN
 (
  SELECT email
  FROM korisnici
  GROUP BY email
  HAVING COUNT(*) > 1
 )
ORDER BY email

Na žalost, ovo neće da radi u MySQL-u, još uvek ne. Najavljeno je za narednu verziju jezika...
U međuvremenu - mora da se radi u 2 koraka.

Prvi query vraća listu multipliciranih emailova, što kroz PHP treba da se unese kao lista vrednosti za drugi query...
[ _owl_ @ 06.03.2004. 23:00 ] @
A sta ce ti spoljni upit, dovoljno je samo unutrasnji:
Code:

SELECT email, ime, COUNT(email) 
FROM tabela
GROUP BY email, ime
HAVING COUNT(email)>1

[ noviKorisnik @ 06.03.2004. 23:22 ] @
Čini mi se da ovo ne radi... odnosno radi samo za one koji imaju duplirano i ime i email. Traži se lista svih imena vezanih za duplikate emaila.
[ broker @ 07.03.2004. 12:35 ] @
Cek cek.. ti ne razumes SQL upit koji ti je coek dao?

Imas detaljno objasnjenje na http://www.mysql.com/documenta...apter/index.html#Counting_rows
[ _owl_ @ 07.03.2004. 14:54 ] @
Da, da sad sam pogledao sta je covek trazio
[ Kusur @ 07.03.2004. 15:54 ] @
Možda nisam dobro objasnio šta mi treba, ali ste mi ipak pomogli

Upotrebio sam kod od _owl_ -a:

Code:
SELECT mail, COUNT(mail)
FROM korisnici
GROUP BY mail
HAVING COUNT(mail)>1


Izbacio sam grupisanje po imenu zato što greši u brojanju

Baš sam to tražio - sad znam koji su mail-ovi duplikati i koliko ih ima.

Puno hvala!
[ bluesman @ 12.03.2004. 13:58 ] @
Dobio si duplikate i znas da ima 5 ovih, 15 onih, 7 drugih... kako da obrises sve duplirane a da ostane po jedan. Znaci hocu umesto 5 sa istim e-mailom da obrisem 4 a da ostane samo 1. Naravno, da se ne radi rucno.

Ili konkretnije, imam bazu od oko 25000 korisnika gde su se neki prijavili i po 70 puta. proverio sam i imam oko 3 hiljade korisnika koji su se registrovali vise od jednom (po postanskoj adresi) sto daje negde oko 7 hiljada upisa. Opet postoji problem posto verovatno Karadjordjeva 12 postoji i u Beogradu i u Novom Sadu. ali to je sada manje vazno... mogu da ga grupisem i po imenu i prezimenu. Postoji jos jedna problem, sa iste adrese su se registrovali njih cetvoro (cela porodica) a ja hocu samo 1 po adresi.

Da li ima neko ideju kako da (naravno, ne rucno) obrisem 69 upisa tog sto se registrovao 70 puta a da ostane samo 1 (bilo koji).
[ Jbyn4e @ 12.03.2004. 14:11 ] @
Hm, mozda je najlaksi (koji mi sad pada na pamet) nacin napraviti skript koji ce da puni drugu (novu) tabelu(e) sa podacima, s tim da kad uzima iz stare proveri da li u novoj vec postoji podudaranje, pa da ubacuje samo ako ne postoji. Naravno, posle obrises stare tabele, nove preimenujes u stare.

Nemam sad vremena da razmisljam o tome....
[ bluesman @ 12.03.2004. 14:28 ] @
Jedno resenje je kopiranje svih duplikata u temp tabelu, pa brisanje istih iz originalne tabele, a onda preko distinct iz temp tabele vratiti po 1 row u originalnu tabelu... da li postoji bolje, elegantnije resenje?
[ noviKorisnik @ 12.03.2004. 14:32 ] @
Relativno lako.

Metod 1:
Poteraš upit da ti grupiše po svim poljima koja želiš da budu jedinstvena, gde je count(*) veće od 1. Prihvatiš rezultat i provučeš ga kroz petlju gde prvo brišeš sve redove nađenih duplikata i odmah nakon toga kreiraš novi zapis sa podacima reda iz rezultata.

Metod 2:
Napraviš privremenu tabelu gde insertuješ grupisane duplikate. Potom brišeš duplikate. Na kraju prebaciš podatke iz privremene tabele i ubiješ je. Ovo bi trebalo da brže radi.

Ovo ne radi baš kako si opisao jer se brišu svi zapisi pa potom dodaje jedan, ali deluje jednostavnije za realizaciju.
[ noviKorisnik @ 12.03.2004. 14:34 ] @
Eh, da - napomena: kad insertuješ u temp tabelu - ne insertuješ sve duplikate nego samo 1 zapis po svakoj grupi duplikata.
[ -zombie- @ 12.03.2004. 16:17 ] @
napraviš drugu tabelu sa istim poljima, dodaš UNIQUE ključ na polja koja u kombinaciji moraju biti jedinstvena (adresa, grad) i uradiš jedan prosti

insert into tabela2 select * from tabela1