Autor Zpráva
pajadvorak
Profil
Potřeboval bych, prosím, pomoct s příkazem pro MySQL. Chci vyhledat duplicity emailů. V tabulce je datum vložení. A já chci hledat duplicitu vložení s rozdílem data vložení například 1 měsíc. Takže všechny ostatní duplicity, které jsou od sebe více jak 1 měsíc potřebuji ignorovat. Jak to mám udělat? Děkuji moc za pomoc.

SELECT `email`, COUNT(email) AS pocet_vyskytu FROM tabulka GROUP BY email HAVING pocet_vyskytu > 1 
Kajman
Profil
Jaká verze mysql?
pajadvorak
Profil
Kajman:
10.1.41-MariaDB-0+deb9u1 - Debian 9.9
Kajman
Profil
Asi něco jako
SELECT t.email,
       t.vlozeno
FROM   tabulka t
       JOIN tabulka t2
         ON t.email = t2.email
            AND t2.vlozeno BETWEEN Date_sub(t.vlozeno, INTERVAL 1 month) AND
                                   Date_add(t.vlozeno, INTERVAL 1 month)
GROUP  BY t.email,
          t.vlozeno
HAVING Count(*) >= 2

Od verze 10.2.2 by to šlo ladně řešit window funkcemi lag a lead.
pajadvorak
Profil
Kajman:
To bohužel nefunguje dobře. Ukáže to mnoho výsledků. A když dám zobrazit t.vlozeno a t2.vlozeno, tak je tam shodný datum. Data by se měla předpokládám lišit. A t.email, ani t2.email nic neukáže. Mělo by to de facto ukázat pář řádků. Celý proces trvá cca 17 vteřin, v tabulce je cca 120.000 řádků. Půjde to vyřešit lépe? Děkuji moc za pomoc.
juriad_
Profil *
Ono to najde duplicitu z obou stran. Chtělo by to rozbít symetrii časové podmínky. Vhodné by bylo také zakázat shodný čas vlozeno.
Zkus tedy:
t2.vlozeno > t.vlozena and t2.vlozeno < date_add(t.vlozeno, interval 1 month)
A having můžeš odstranit.

Zkus si také vypsat max(t2.vlozeno).

Ono to vrací víc řádků nejspíš ptoto, že v rámci jednoho měsíce je duplicit jednoho e-mailu víc.
Úplně to lehce vyřešit nepůjde, protože si představ 3 záznamy se stejným e-mailem 20 dnů po sobě. První a třetí nejsou vzájemně duplicitní. Nebo chceš raději identifikovat duplicitní záznamy a pak nad nimi vypočítat tranzitivní uzávěr a vrátit jediného reprezentanta?
Kajman
Profil
pajadvorak:
Bez struktury tabulky se nedá uhádout, zda tam je např. primární klíč. Proto tabulku spojuji i ten samý řádek. Proto je však v having podmínka na počet alespoň 2, kdy se ten jeden sám sebe ignoruje.

Pokud tam máte mnoho výsledků, tak tipuji, že tam je prostě mnoho duplicit. Vypsalo to nějaký řádek, ke kterému nebyla vypsána i duplicita v hledaném intervalu? Ale možné, že jsem dotaz napsal špatně. Nejlépe, když na sqlfiddle.com nachystáte ukázku dat, kde ten dotaz nevypisuje, co má.

Vypisovat sloupce, které nejsou v group by má smysl jen při použití agregační funkce a přísně nastavený server by to ani neměl povolit.

Dotaz by se samozřejmě dal napsat mnohem lépe a efektivněji od verze 10.2.2. Ve staré verzi můžete zkusit rychlost poladit dvousloupcovým indexem (email, vlozeno).
pajadvorak
Profil
Už jsem to nějak dal do kupy. Děkuji.
Kajman
Profil
A jak to dopadlo?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0