Autor Zpráva
MartinKloubek
Profil
Dobrý den,

mám tabulku kde jsou 3 sloupky email1,email2,email3

potřeboval bych dotaz který mi vypíše ty emaily které jsou duplicitní.
Ale nejen ve sloupkách email1,2,3 ale i vzájemně to znamená pokud je stejný třeba obsah v email1 a email3 každý v jiném řádku.
Upozornuji že sloupky nejde dát jako unikátní je potřeba aby některé byli duplicitní jen je potřeba aby je bylo možno vypsat.
Udělal jsem script který to dokáže ale těch řádku je 15000 a zamrzne prohlížeč jelikož to mám moc složité.
Nedjřív uzavřu do pole všechny emaily což je cca 45000 polí a pak je porovnávám zda jsou v 1,2,3 víckrát nežli jednou a to je moc dotazů do databáze.

jde to řešit nějakým přímým dotazem který by rovnou vypsal do pole názvy duplicitních a pak bych
jen z pole vypsal ty které jsou stejné?
díky
za pomoc.
Kajman_
Profil *
Možná takhle nějak...
select tmp.email from (select email1 as email from tabulka
union all
select email2 as email from tabulka
union all
select email3 as email from tabulka) tmp group by tmp.email having count(*)>1
nightfish
Profil
select em1 from email where em1 in (select em2 from email) or em1 in (select em3 from email);
select em2 from email where em2 in (select em1 from email) or em1 in (select em3 from email);
select em3 from email where em3 in (select em1 from email) or em1 in (select em2 from email);
select em1 from email group by em1 having count(em1) > 1;
select em2 from email group by em2 having count(em2) > 1;
select em3 from email group by em3 having count(em3) > 1;

...těchhle 6 dotazů by to mohlo (velmi neobratně) řešit
a zřejmě tam budou nějaké duplicity
ale nic lepšího mě momentálně nenapadlo, nicméně nic není ztraceno, třeba příjde Kajman nebo někdo jiný s lepším řešením

EDIT: ...pozdě a neefektivně, ale přece...
MartinKloubek
Profil
ten od Kajmana je super. Funguje perfektně.
jen ještě dotaz když bych chtěl do tohoho dotazu podmínku WHERE neco='a' kam?
Podmínka platí pro celou tabulku tedy celý řádek.

select tmp.email from (select email1 as email from tabulka
union all
select email2 as email from tabulka
union all
select email3 as email from tabulka) tmp group by tmp.email having count(*)>1
Kajman_
Profil *
třikrát za slovo tabulka
MartinKloubek
Profil
jsem si to myslel dík... :)
MartinKloubek
Profil
Asi jsem natvrdlej, ale prosím ješte o malou radu
mám takto dotaz:

if (!($mista_i = mysql_db_query($nazev_databaze,"select tmp.emaily from (select email as emaily from table union all select email_2 as emaily from table union all select email_3 as emaily from table) tmp group by tmp.emaily having count(*)>1"))) { return 0 ; }
while(($mi = mysql_fetch_array($mista_i)))
{

když dám
echo $mi[emaily] nebo
echo $mi[email_2] nic to nevypíše...:(
jak si z toho dotazu vypíšu ten email?

díky za pomoc..
nightfish
Profil
while (($mi = mysql_fetch_row($mista_i))) {
echo $mi[0];
}
MartinKloubek
Profil
Tak to jsem zkoušel a také nic... :(

while (($mi = mysql_fetch_row($mista_i))) {
echo $mi[0];
}


Přitom dotaz se provede naskočí vše ale nemám naplněnou proměnnou
error to neháže.
vypíše mi to kompletní seznam. Ale já bych potřeboval abych si mohl ten seznam seřadit dle emailů
proto potřebuji vypsat vždy ten text duplicitního emailu...
Kajman_
Profil *
Nechápu, s čím máte problém. Píšete, že to nic nevypíše a také píšete, že to vypíše kompletní seznam.

Pokud to chcete seřadit, tak dejte na konec dotazu order by tmp.emaily a je to. No a pokud se divíte, že je to za sebou, tak si tam dejte nějakou html značku (br, li).
MartinKloubek
Profil
už jsem problém našel moje chyba.
problém nebyl v tomto dotazu ale v následných řádkách díky
za radu.
Toto téma je uzamčeno. Odpověď nelze zaslat.