MySQL SELECT kérdés

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?

Hozzászólások

Ekezetes karakterek problema: milyen karakterkodolasu a tabla / mezo, ami alapjan csoportositassz?

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 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...

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.

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 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 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.

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...)?

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"

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.

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"

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ó.

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 :)