Autor | Zpráva | ||
---|---|---|---|
andynewcastleth Profil |
#1 · Zasláno: 19. 11. 2019, 06:59:06
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 |
#2 · Zasláno: 19. 11. 2019, 07:44:27
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 |
#3 · Zasláno: 19. 11. 2019, 08:11:20
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 |
#4 · Zasláno: 19. 11. 2019, 08:20:48
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 |
#5 · Zasláno: 21. 11. 2019, 12:47:58
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 |
#6 · Zasláno: 21. 11. 2019, 13:35:16
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 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 |
#8 · Zasláno: 21. 11. 2019, 15:45:27
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 |
#10 · Zasláno: 21. 11. 2019, 18:20:32
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 |
#11 · Zasláno: 22. 11. 2019, 04:27:12
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. |
||
Časová prodleva: 4 roky
|
0