Próbáltam többféle módon megfogalmazni a google keresőbe, de valahogy nem sikerült megfelelő megoldást találnom rá eddig. Biztos vannak páran, akiknek sikerült már megoldani ezt a problémát:
Van egy egyszerű adatbázis és szeretném az egyik tábla egyik egyedi sorait kiíratni viszont a GROUP BY az ékezetes karaktereket tartalmazó sorokat kihagyja, ez lenne az egyik problémám. A másik pedig az, hogy a kicsit eltérően megadott de lényegében ugyanazon adatot tartalmazó sorokat is egyedinek veszi.
pl. ezek esetében csak egy egy találatot kellene kiírnia
Leverkursen
Bayer Leverkursen
Bayer 04 Leverkursen
Bayern München
B. München
Van erre bármi egyszerű megoldás?
- 10471 megtekintés
Hozzászólások
Ekezetes karakterek problema: milyen karakterkodolasu a tabla / mezo, ami alapjan csoportositassz?
- A hozzászóláshoz be kell jelentkezni
A tábla illesztés: utf8_general_ci
mysql_query("SET NAMES 'utf8';");
mysql_query("SET CHARACTER SET 'utf8';");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci';");
És ez lenne az a lekérdezés:
SELECT origdate,hometeam,awayteam,result,matchtime FROM football GROUP BY hometeam ORDER BY origdate DESC
- A hozzászóláshoz be kell jelentkezni
A tabladefinicio mit mond a hometeam mezore?
- A hozzászóláshoz be kell jelentkezni
`hometeam` varchar(255) COLLATE utf8_general_ci NOT NULL DEFAULT '',
- A hozzászóláshoz be kell jelentkezni
Rakd at a tablat is, mezot is erre: utf8_bin
Ez megkulonbozteti az ekezetes es nem ekezetes karaktereket.
- A hozzászóláshoz be kell jelentkezni
Átraktam utf8_bin re, viszont így se megy. Ami furcsa "Bayern Mönchen" azt listázza, "Bayern München" azt már nem?!
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
A másik pedig az, hogy a kicsit eltérően megadott de lényegében ugyanazon adatot tartalmazó sorokat is egyedinek veszi.
pl. ezek esetében csak egy egy találatot kellene kiírnia
Leverkursen
Bayer Leverkursen
Bayer 04 Leverkursen
Persze hogy egyedinek veszi, hiszen ezek egyediek. Az SQL nem tudja, hogy te a változatosan leírt focicsapatokat egyben szeretnéd látni, ezt neked kell megoldani.
Két lehetőséged van:
1. egységes formátumra hozod a különféleképpen leírt marhaságokat, update table set fieldname='Leverkursen' where fieldname like '%lever%' -- ezt nyilván csak ésszel, előszor select fieldname from table where fieldname like '%lever%' group by 1 módon megnézed hogy mit is update-elsz.
Majd utána szigorúan nem engedsz mást felvinni, csak ezt az egységes nevet. (Foreign key, stb.)
2. Egy másik táblában csinálsz egy változatos név - egységes név (vagy ID) összerendelést és azt join-olod ehhez a táblához, majd utána csinálod amit akarsz.
Szerintem az 1. megoldás a jobb...
- A hozzászóláshoz be kell jelentkezni
~Ezt használom ittott meglehetős eredménnyel -> http://stackoverflow.com/questions/653157/a-better-similarity-ranking-a…
- A hozzászóláshoz be kell jelentkezni
Ez igen jó, de a feladat kézimunka részét nem helyettesíti, a legjobb esetben is csak megkönnyíti.
- A hozzászóláshoz be kell jelentkezni
Jól kell megválasztani a ranking-et a tárolt eljárásban, de valóban meg kell barátkozni fura lukrafutásokkal. Easy fuzzy - fuzzy response. :DDD
- A hozzászóláshoz be kell jelentkezni
Ja, csak amíg jól beállítod a ranking-et addigra én már rég megcsináltam "kézzel". :)
Ez tipikusan az a feladat, ahol "favágással" sokkal hamarabb megoldod a feladatot, mint bármilyen "okos" vagy "szép" megoldással.
- A hozzászóláshoz be kell jelentkezni
:) Hja, mondjuk inkább az érdeklődőknek dobtam ide, nem a konkrét feladatra optimalizálva.
- A hozzászóláshoz be kell jelentkezni
Úgy tényleg jó, de én a feladat hatékony megoldására koncentráltam.
- A hozzászóláshoz be kell jelentkezni
kérdés persze, hogy van most egy ilyen foshalom, amit rendbe kell tenni egyszer, vagy valami integráción keresztül minden nap érkezik-e egy újabb kupac :)
- A hozzászóláshoz be kell jelentkezni
Az biztos, hogy most van egy :)
Én azt javasoltam, hogy "egységes formátumra hozod a különféleképpen leírt marhaságokat, ... Majd utána szigorúan nem engedsz mást felvinni, csak ezt az egységes nevet. (Foreign key, stb.)"
Értelme csak így van, szerintem legalábbis...
- A hozzászóláshoz be kell jelentkezni
Nyilván, egy ideális világban ez van, csak kérdés, hogy van-e arra lehetőség, hogy ne engedjen felvenni más. Ami, mivel fogalmunk sincs, honnan jön az adat, egyáltalán nem biztos, hogy menni fog. Lehet, hogy nincs ráhatása a forrásra. Ilyenkor nem nagyon látok mást, mint hogy megcsinálja amennyire tudja valami fuzzyval.
- A hozzászóláshoz be kell jelentkezni
Vagy egy mancika tisztitja az adatokat folyamatosan...
- A hozzászóláshoz be kell jelentkezni
Nyilván, az is egy opció, bár megnézem azt a mancikát, aki kézzel ilyet értelmesen csinál :)
- A hozzászóláshoz be kell jelentkezni
Ebben az esetben van az, amit 2.-ként írtam: kell egy tábla ami "a változatos neveket" köti össze az egységes nevekkel, és azt folyamatosan bővíteni.
Ez a megoldás amúgy azért nem a legjobb, mert lehet full marhaságot is beküldeni.
- A hozzászóláshoz be kell jelentkezni
No, csináltam egy tesztet az adott feladatra ("2grams" azonosság), imhol az eredmény:
origó -- input -> egyezési "arány" (1 - tökéletes, 0 - semmi egyforma)
Bayer Leverkursen München -- Bayer Leverkursen -> 0.84210526315789
Bayer Leverkursen München -- Bayern München -> 0.77777777777778
Bayer Leverkursen München -- Bayer 04 Leverkursen -> 0.75
Bayer Leverkursen München -- Leverkursen -> 0.72727272727273
Bayer Leverkursen München -- B. München -> 0.5
Ez elég jó eredmény sztem. Bár nem ismerem a teljes készletet. :)
- A hozzászóláshoz be kell jelentkezni
amugy Leverkusen lenne :)
t
- A hozzászóláshoz be kell jelentkezni
A postban is bugos :)
- A hozzászóláshoz be kell jelentkezni
A nyitóból loptam a sztringeket. De ebben az esetben így alakulna:
Bayer Leverkusen München -- Bayer Leverkursen -> 0.75675675675676
Bayer Leverkusen München -- Bayern München -> 0.8
Bayer Leverkusen München -- Bayer 04 Leverkursen -> 0.66666666666667
Bayer Leverkusen München -- Leverkursen -> 0.625
Bayer Leverkusen München -- B. München -> 0.51612903225806
Köszi a javítást! ;)
- A hozzászóláshoz be kell jelentkezni
"A másik pedig az, hogy a kicsit eltérően megadott de lényegében ugyanazon adatot tartalmazó sorokat is egyedinek veszi."
Nagyon komoly algoritmusok dolgoznak a háttérben, ahol egy kifejezés jelentését (csak a ragozott+rövidített alakokat vesszük) azonosnak veszik.
- A hozzászóláshoz be kell jelentkezni
Olyan, hogy "lényegében ugyanaz" nincs az SQL-ben :-P Ha az adatok egységesítése, adattisztítás a cél, akkor az bőven munkás lesz, és nincs rá univerzális recept.
Egyébként hány rekordról van szó (nagyjából...)?
- A hozzászóláshoz be kell jelentkezni
Amire Te keresel megoldást, az az adattisztítás témaköre. Ez nagyon nem trivi kategória. Fuzzy logic, fuzzy matching kulcsszavakra keress.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
- A hozzászóláshoz be kell jelentkezni
Alapban igazad van, de ide overkill.
TFH egy 16 csapatos bajnokság csapatait átlagosan 20 féleképpen írt le az istenadta és ebből pontosan 1 a jó, akkor a tisztításhoz kell 16 query ahol a where-ben van átlag 19 db "fieldname = 'rossz_csapatnev'" feltétel or kapcsolattal.
- A hozzászóláshoz be kell jelentkezni
16 csapatos bajnoksághoz tényleg overkill, de gondolom, nem 16 csapatod van, különben kézzel már 30x megcsináltad volna.
Tervezési hibát utólag javítani borzasztó macerás (tudom, utólag könnyű nagymegmondani), így csak szimplán részvétem.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
- A hozzászóláshoz be kell jelentkezni
Fogalmam sincs, hogy hány csapatos szarhalmot nyert meg a topicindító - aki eltűnt vagy 2 napja, szóval lehet hogy már rég mecsinálta és el is felejtette ezt az egészet. :)
Mindenesetre tapasztalatom szerint még párezres mennyiségű dzsuvánál is hatékonyabb a kézimunka, mint bármilyen algoritmikus megfejtés - már ha egyszeri feladatról van szó.
- A hozzászóláshoz be kell jelentkezni
Itt az volt a baj, hogy nem tudta, hogy meg kell csinálni :)
Y generáció azt gondolja, hogy minden rendszer/elem (CPU, SQL, Egér) úgy működik, mint a Google és olyan olcsó, mint egy ingyenes App.
- A hozzászóláshoz be kell jelentkezni
Neked az utf8_unicode_ci a megoldás.
A utf8_general_ci gyorsabb, viszont nem tud ékezetes karakterek alapján rendezni, leegyszerűsítve.
Bővebben, például:
"utf8_general_ci does not support expansions/ligatures, it sorts
all these letters as single characters, and sometimes in a wrong order."
https://forums.mysql.com/read.php?103,187048,188748
Ez persze a többszörözött sorokra nem megoldás, sőt...
Sakk-matt,
KaTT :)
- A hozzászóláshoz be kell jelentkezni
[off]
milyen érdekes lenne amikor a receptes könyvet olvasva
főzik helyett
fosik
és hasonlók szerepelnének végülis hasonlóak..
[/off]
---
Referrall https://goo.gl/7S2vlp (koding) | https://goo.gl/muWzKz (digitalocean)
- A hozzászóláshoz be kell jelentkezni