How to select every duplicated row (výběr duplicit) – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

How to select every duplicated row (výběr duplicit) – MySQL – Fórum – Programujte.comHow to select every duplicated row (výběr duplicit) – MySQL – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
w3m0
Grafoman
26. 11. 2009   #1
-
0
-

Z tohohle začínám šílet, páč už devátou hodinou nad tím sedím a nemůže přijít na žádné řešení a ani na Google nic nevidím.

Klasický kód pro výběr duplicit>

select username, jmeno, count(jmeno) from tb group by jmeno having count(jmeno) > 1;

Vrátí jen jednu z těch duplicit... (například mojeusername | Honza)
Ale jak mám udělat, abych z toho SQL dotazu dostal obě dvě (obě tři, obě čtyři, podle toho, kolik jich je :))) duplicity?
(například mojeusername | Honza ; jineusername | Honza)

Sice to píšu už nervózně a víceméně nepochopitelně, ale snad tušíte, co tím myslím....:/

Nahlásit jako SPAM
IP: 84.42.151.–
Sa Nata A Na. Howgh
Reklama
Reklama
qwrrzu
~ Anonymní uživatel
6 příspěvků
26. 11. 2009   #2
-
0
-

Tak jednak výrazům jako "obě tři", "obě čtyři" není moc rozumnět. Si sám proti sobě, takhle to bude každému trvat déle než tvůj dotaz pochopí a tedy než ty dostaneš odpověď.

Dále ten select co si uvedl je v samé své podstatě nesmyslný. Kdyby si pracoval v nějaké databázi, tak by si zjistil proč (ani by si ho nespustil).

A co třeba zkusit tohle: select username, jmeno, count(jmeno) from tb group by username, jmeno having count(jmeno) > 1;

Nahlásit jako SPAM
IP: 90.179.140.–
w3m0
Grafoman
26. 11. 2009   #3
-
0
-

Abych to vysvětlil na příkladu, potřebuji vědět všechny username, jejichž e-mail je v databázi více než jednou, tedy z

pepa | email1@gmail.com
honza | email1@gmail.com
jirka | email2@gmail.com

vybrat:

pepa | email1@gmail.com
honza | email1@gmail.com

protože tam je dvakrát stejný e-mail.

Našel jsem diskuze jako - http://www.webmasterworld.com/forum112/438.htm - tato, kde jim stačí selectnout pouze jednu z duplicit..

A pardon za chaotičnost minulého příspěvku, jsem po mnoha hodinách zkoušení nějaký nervózní...


qwrrzu> Pokud vidím, tvůj select je téměř to samé jako ten můj, až na nesrovnalost v GROUP by (psáno zpaměti).
Můj problém je téměř stejný, jako výše napsaný s těmi e-maily a jmény, jen místo username mám ID a username zízkávám až po jednom LEFT JOINu, ale to už zvládnu, jde mi víceméně jen o to, jak vybrat pomocí GROUP by a HAVING všechny duplicity, tedy tu samou duplicitu potřebuji například třikrát, protože má pořád jiné ostatní sloupce..

Nahlásit jako SPAM
IP: 84.42.151.–
Sa Nata A Na. Howgh
qwrrzu
~ Anonymní uživatel
6 příspěvků
26. 11. 2009   #4
-
0
-

Ano je skoro to samé, nicméně správné. Zkuste si Vámi navrhovaný select spustit v Oracle, Accessu a jiných DB, skončí to chybovým hlášením. A proč? Protože Pokud udělám group by nad sloupcem jmeno, tak se "sgrupují" stejné hodnoty v tento sloupci (pochopitelně) a jak si má dle Vás DB vybrat, co vypíše do sloupce username? Náhodnou hodnotu? To je přeci nesmysl.

Nahlásit jako SPAM
IP: 90.179.140.–
qwrrzu
~ Anonymní uživatel
6 příspěvků
26. 11. 2009   #5
-
0
-

To co chcete by pak tedy vypadalo třeba takto:

select Name, UserName from a where UserName in (select UserName from a group by UserName having count(UserName) > 1);

Nahlásit jako SPAM
IP: 90.179.140.–
qwrrzu
~ Anonymní uživatel
6 příspěvků
26. 11. 2009   #6
-
0
-

EDIT: Asi jsem to měl uvést na Váš konkrétní příklad. Tak tedy ještě jednou:

select UserName, Email from a where Email in (select Email from a group by Email having count(Email) > 1);

Nahlásit jako SPAM
IP: 90.179.140.–
dannyk0
Věrný člen
26. 11. 2009   #7
-
0
-

Pomoci GROUP BY to nelze vybrat, protoze to je agregacni funkce a musi byt doplnena o nejakou agregacni funkci, ktera v tomhle pripade nema smysl a nejde pouzit.

Mozna by to slo pres JOINy, ale v nich nejsem tak zbehly. Ja bych na to asi sel pomoci subquery:



SELECT name, email FROM table WHERE email IN (SELECT DISTINCT email FROM table)

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
qwrrzu
~ Anonymní uživatel
6 příspěvků
26. 11. 2009   #8
-
0
-

To dannyk : On chce jen takové uživatele, jejichž email se vyskytuje v databáze vícekrát (tedy vybrat uživatele , kteří jsou registrovaní na stejný email). Takže Vámi navrhovaný select fungovat nebude.

Nahlásit jako SPAM
IP: 90.179.140.–
w3m0
Grafoman
26. 11. 2009   #9
-
0
-

Ano je skoro to samé, nicméně správné. Zkuste si Vámi navrhovaný select spustit v Oracle, Accessu a jiných DB, skončí to chybovým hlášením.

Ano, tedy pokud se používá ve výběru selectu zároveň sloupec a agregovaná hodnota, musí se uvést do GROUP BY všechny neagregované názvy sloupců. Uznávám, že pro striktní databáze je tento kód naprosto nesmyslný, psal jsem ho zpaměti jen pro nastínění, protože je to něco podobného tomu, co jsem potřeboval.

EDIT: Asi jsem to měl uvést na Váš konkrétní příklad. Tak tedy ještě jednou:
select UserName, Email from a where Email in (select Email from a group by Email having count(Email) > 1);



Nejde o můj konkrétní příklad; ve skutečnosti to používám na zcela jiném místě. Potřeboval jsem pouze nastínit, jakým způsobem by se tohle dalo udělat. Přepisování doopravdy nebylo nutné, ale za tento nápad jsem doopravdy vděčný, protože to již funguje. (opravdu nevím, jak poděkovat;)

dannyk: počítám, že tohle řeší něco mírně jiného, ale jsem rád za ochotu, už to po správné radě od qwrrzu nebylo nutné;)

Nahlásit jako SPAM
IP: 84.42.151.–
Sa Nata A Na. Howgh
dannyk0
Věrný člen
26. 11. 2009   #10
-
0
-

Aha, te podminky jsem si nevsiml :) Jak napsal qwrrzu, tak bych to napsal taky tak nebo obdobne.
BTW: Jak sem to psal ten prispevek, tak to tam jeste nemel :)

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
KIIV+42
God of flame
26. 11. 2009   #11
-
0
-

btw kolega z obchodniho zvladl napsat sql dotaz na zjisteni urcitejch duplicit .. skoda jen ze ho spustil nekolikrat a ani po 5 dnech nebyl hotov.. (jeste sme to museli sestrelit protoze: "proc sakra zabrany 3/4 procesoru na 100%??")

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
qwrrzu
~ Anonymní uživatel
6 příspěvků
27. 11. 2009   #12
-
0
-

Včera jsem tu už nebyl, tak ještě takto dodatečně dodávám řešení přes JOIN. Pro velké tabulky by byl vhodnější.

select a.Name, a.Email from a inner join (select aa.Email from a aa group by aa.Email having count(aa.Email) > 1) t on a.Email = t.Email;

Nahlásit jako SPAM
IP: 90.179.140.–
w3m0
Grafoman
28. 11. 2009   #13
-
0
-

qwrrzu: Sice půjde o větší tabulku (500-5000 záznamů, ale samotný dotaz bude volán maximálně dvakrát denně, proto zátěž není tak důležitá.). Pokud budu mít čas, tak to ještě stejně přepíšu. Děkuji mnohokrát :]

Nahlásit jako SPAM
IP: 84.42.151.–
Sa Nata A Na. Howgh
sepp
~ Anonymní uživatel
1 příspěvek
14. 11. 2011   #14
-
0
-

diky, ta aduplicita pomohla

Nahlásit jako SPAM
IP: 147.33.10.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý