Autor Zpráva
andynewcastleth
Profil
Já vím, že to není efektivní. A ani to není mysqli. To nevadí.

Ale tento script smaže všechny duplicity a nezanechá ani originální příspěvek. Já ovšem chci zachovat jeden.

        $result=mysql_query("SELECT * FROM a_zalozna where povoleno = '0'");
        while ($vypis=mysql_fetch_array($result))
        {
            $dupla2=$vypis["text"];
            $dupla2=mysql_real_escape_string($dupla2);
            $id2=$vypis["id"];
            $druhy=mysql_query("SELECT * FROM a_zalozna where povoleno = '0' AND text='$dupla2' AND id!='$id2'");
            while ($vysledek=mysql_fetch_array($druhy))
            {
                $ids=$vysledek["id"];
                mysql_query("DELETE FROM a_zalozna where povoleno = '0' AND id='$ids'") or die(mysql_error());
            }
        }
Taps
Profil
zkus se inspirovat skriptem - viz Některé časteji řešené dotazy pro MySQL - FAQ » Odstranění duplicit
SQL se provede, tak jak ho máš napsaný.
Kajman
Profil
Problém působí to, že výsledek prvního dotazu je stále stejný a neubívají tam smazané věci, pak se tedy hledá i duplicita ke smazané věci a smaže se vše s duplicitním textem.

Pokud se má zachovat nejvyšší id (poslední řádek), tak zkuste po zálohování dat
DELETE FROM t1
USING  a_zalozna t1,
       a_zalozna t2
WHERE  t1.text = t2.text
       AND t1.povoleno = 0
       AND t2.povoleno = 0
       AND t1.id < t2.id 

Pokud se má zachovat nejnižší id (nejstarší řádek), tak dejte do posledního řádku většítko.
andynewcastleth
Profil
Já vezmu obsah tabulky. Něco smažu. Ale obsah, se kterým nadále pracuji se neaktualizoval, a já pořád pracuji s tím původním obsahem bez smazaného záznamu, ano? To by potom dávalo smysl, proč se mi mažou všechny záznamy.

----

Jinak jsem vyzkoušel řešení Kajman (resp. Taps odkaz) a funguje to výborně. Díky!
andynewcastleth
Profil
Zkoušel jsem výše uvedený dotaz (DELETE FROM t1 USING a_waiting t1, a_waiting t2 WHERE t1.text = t2.text AND t1.id > t2.id) na nové tabulce, která má 80 000 záznamů (65MB) a kterou potřebuji pročistit.

Ale nic se neprovede - resp. jsem zaseknutý v "Loading" - ať již zkouším na hostingu nebo na localhostu (XAMPP)?
Kajman
Profil
Zkuste vytvořit index nad sloupcem text.

A když hledáte četnost duplikátů nad tímto sloupcem
select t.text, count(*) radku from a_waiting t group by t.text order by 2 desc
tak to vrátí hodně záznamů a velké hodnoty vypočtených řádků?

Asi by to šlo přepsat, že se to bude linkovat až s výsledkem zgroupování, aby nedocházelo k velkému narůstání kombinací.
andynewcastleth
Profil
Kajman:
vrátilo to 14306 vypočtěných řádků

nejčastější řádek je duplicitní 1300x, následují 900x, 800x apod.
Kajman
Profil
Vhodnost indexu nad sloupcem text stále platí. Možná bude rychlejší tento dotaz

DELETE
FROM   t1
USING  a_waiting t1,
       (
                SELECT   t.text,
                         min(id) zachovat
                FROM     a_waiting t
                GROUP BY t.text
                HAVING   count(*)>=2) t2
WHERE  t1.text = t2.text
AND    t1.id != t2.zachovat 


Když by to stále nešlo, můžete zkusit dát pro první průchod např. 500 místo dvojky, pro druhý třeba 50 a pak až 2.
andynewcastleth
Profil
Díky, to fungovalo celkem dobře.
8 sekund a zůstalo mi 14 000 záznamů

----


Pokud chci přidat index na localhostu, tak mi to jde. Ale na hostingu ne?

"#1170 - BLOB/TEXT column 'text' used in key specification without a key length"

Přitom jsou ty databáze identické.
Kajman
Profil
Tak tam tu délku indexu při jeho vytváření zadejte (tedy kolik znaku za začátku se má pro index použít - delší texty se stejným začátkem pak musí databáze porovnávat pomaleji).
andynewcastleth
Profil
Udělal jsem to takto a zdá se, že to vše funguje OK a všechny mé dotazy jsou vyřešeny.

CREATE INDEX jmenoindexu ON a_waiting(text(333));

Díky.

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