[ 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
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|