Forum » Programiranje » [MariaDB] - Brisanje tistih duplikatov, ki imajo višji id
[MariaDB] - Brisanje tistih duplikatov, ki imajo višji id

HotBurek ::
Dobro jutro.
Evo, zdajle sem pri koncu s prvim sešnom. Autocoplete power-ed by SQL zadovoljivo hitro in uspešno nastaja.
Seadj pa izziv.
V tabeli imam nekaj duplikatov. Rad bi pobrisal tiste duplikate, ki imajo večji id (po grupah, ane).
Takole lahko zlistat tiste, ki so duplikati.
Takole lahko za duplikat najdem višji id:
Zdej moram pa to še nekako zvezat skupaj... Tu se je ustavilo.
Evo, zdajle sem pri koncu s prvim sešnom. Autocoplete power-ed by SQL zadovoljivo hitro in uspešno nastaja.
Seadj pa izziv.
V tabeli imam nekaj duplikatov. Rad bi pobrisal tiste duplikate, ki imajo večji id (po grupah, ane).
Takole lahko zlistat tiste, ki so duplikati.
SELECT *
FROM (
SELECT `id`, `keyword`, COUNT(*) AS 'count'
FROM `autocomplete`
GROUP BY `keyword`, `country`
) AS x
WHERE x.`count` > 1;
Takole lahko za duplikat najdem višji id:
SELECT MAX(`id`) AS 'id', `keyword`
FROM `autocomplete`
WHERE `keyword` = 'test'
GROUP BY BINARY `keyword`;
Zdej moram pa to še nekako zvezat skupaj... Tu se je ustavilo.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
- spremenilo: HotBurek ()

socialec ::
ok, mod, imaš prav, za ohranitev nekdanje forumske uporabnosti je potrebno, če sploh, resno participirati v temu...
op, tole bi delovalo?
op, tole bi delovalo?
DELETE a
FROM autocomplete a
JOIN autocomplete b
ON a.keyword = b.keyword
AND a.country = b.country
AND a.id > b.id;

Tody ::
Po vseh teh letih si se vedno nisi privoscil sql tecaja na udemy... Ko v ta prvem stavku najdes vse podvojene nad njimi naredis novo poizvedbo.
Vparasi chatgtp pa ti bo razložil korak za korakom, tko da bose vedel kaj je naredil in se se kaj naučili
Vparasi chatgtp pa ti bo razložil korak za korakom, tko da bose vedel kaj je naredil in se se kaj naučili
Zgodovina sprememb…
- spremenil: Tody ()

HotBurek ::
Rešil sem takole:
Čeprav, rešitev od gospoda zgoraj je mogoče boljša, ker če imaš več kot 2 ponovitve:
- moja rešite pobriše zgolj tisto z MAX id
- od gospoda pa vse, ki so višje od MIN (s tem, da bi bilo potrebno to malo dodelat)
Evo, sem dodal unique index gor, in pravi, da je vse unique, hrakti so pa podatki še v tabeli. Haha.
Gremooooo.... iiiiiiiiii ... bbiiiiiiiiii ..... cccaaaaaaaaa.
DELETE
FROM `autocomplete`
WHERE `id` IN (
SELECT x.`id`
FROM (
SELECT MAX(`id`) AS 'id', `keyword`, COUNT(*) AS 'count'
FROM `autocomplete`
GROUP BY BINARY `keyword`, `country`
) AS x
WHERE x.`count` > 1
);
Čeprav, rešitev od gospoda zgoraj je mogoče boljša, ker če imaš več kot 2 ponovitve:
- moja rešite pobriše zgolj tisto z MAX id
- od gospoda pa vse, ki so višje od MIN (s tem, da bi bilo potrebno to malo dodelat)
Evo, sem dodal unique index gor, in pravi, da je vse unique, hrakti so pa podatki še v tabeli. Haha.

Gremooooo.... iiiiiiiiii ... bbiiiiiiiiii ..... cccaaaaaaaaa.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

socialec ::
v zasnovi problema si bil dovolj precizen, ni mi jasno, kako si zadovoljen s polovično rešitvijo...
ah, ti moderni časi...
ah, ti moderni časi...

HotBurek ::
Dodal bom še eno malenkost, mogoče pride prav v prihosnosti.
Če je collation nastavljen na utf8mb4_bin, ima ta collation PAD SPACE, kar pomeni, da enači 'a' = 'a '. In če sta vnešeni obe vrednosti, potem ni mogoče dat unique index-a gor (in obratno).
Da se zadevo reši, ob predpostavki da se želi 'a' in 'a ' obravnavat kot dve različni vrednosti, je potrebno stolpec nastavit na NO PAD collation.
V mojem primeru: iz utf8mb4_bin na utf8mb4_nopad_bin
SQL v pomoč:
Vir: https://mariadb.com/kb/en/supported-cha...
Če je collation nastavljen na utf8mb4_bin, ima ta collation PAD SPACE, kar pomeni, da enači 'a' = 'a '. In če sta vnešeni obe vrednosti, potem ni mogoče dat unique index-a gor (in obratno).
Da se zadevo reši, ob predpostavki da se želi 'a' in 'a ' obravnavat kot dve različni vrednosti, je potrebno stolpec nastavit na NO PAD collation.
V mojem primeru: iz utf8mb4_bin na utf8mb4_nopad_bin
SQL v pomoč:
SELECT collation_name
FROM information_schema.COLLATIONS
WHERE collation_name LIKE '%nopad%'
AND collation_name LIKE '%utf8%';
Vir: https://mariadb.com/kb/en/supported-cha...
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()

socialec ::
Verjetno se najde tudi kakšen trim() poleg lower()... encodingi so verjetno enotni.
Mislim, nimam ničesar od tega, ker... nimam :D
Mislim, nimam ničesar od tega, ker... nimam :D

Utk ::
Po 9 letih odpiranja tem o tem, se pravi da se vsaj tolk časa ukvarja s tem...še zmeraj je pri osnovah.

socialec ::
HotBurek chata na tak način in na glas razmišlja - da je še nekako smiselno in tehnično forumsko.
Vsi ne marajo tega, meni pa je tudi zabavno, ker ne škodi.
Vsi ne marajo tega, meni pa je tudi zabavno, ker ne škodi.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | MySqlOddelek: Programiranje | 779 (442) | kuall |
» | [MariaDB] Zakaj SQL enači "ab " z "ab" v WHERE pogoju?Oddelek: Programiranje | 1127 (712) | DamijanD |
» | Kako pohitrit build-anje index za autocomplete?Oddelek: Programiranje | 1133 (665) | DamijanD |
» | [MariaDB] Kako definirat tabelo, da bo index ločil med "a" in "ä"?Oddelek: Programiranje | 880 (594) | Miha 333 |
» | [MariaDB] Kolikokrat se pojavi tekst v tekstu?Oddelek: Programiranje | 866 (559) | BigWhale |