Alexander (HH): MySQL : mit regulären Ausdrücken Wörter für Buchstaben suchen

Beitrag lesen

Moin Moin!

»» Ich würde angesichts der Joker-Problematik allerdings nochmal nachdenken,

(Fehlende Fußnote: Wirklich als Nachdenken gemeint, ich hab nicht weiter gegrübelt, ob die Normalisierung hilft oder stört.)

»» ob die Buchstabehäufigkeiten in einer getrennten Tabelle nicht besser aufgehoben wären, weil GROUP BY, COUNT und SUM da evtl. einfacher zu formulieren sind.

Ich verstehe dich so: für jeden Buchstaben eines jeden Wortes einen neuen Datensatz anlegen? Spalten: word_id (mit Index), letter, number.

Ja, genau. Wobei number ein reserviertes Wort bei einigen RDBMS ist. Nennen wir die Tabelle mal provisorisch letter_freq, mit word_id, letter, n (statt number).

Dann mit SUM bzw. COUNT alle Häufigkeiten (number) eines Indexes addieren? Das gilt für den Abgleich wegen Jokern. Für die einfache Suche verfahre ich dann aber wie? Wahrscheinlich mit GROUP? Habe ich noch nicht gemacht, daher die Rückfrage.

Die Suche nach "zwei Es, zwei Rs, und zwei beliebige andere Buchstaben" müßte natürlich anders formuliert werden. Schon auf Deutsch: Gesucht sind alle Worte mit insgesamt sechs Buchstaben, in denen die Buchstaben E und R je zweimal vorkommen.

Erste Forderung - Wortlänge:

select word_id from letter_freq group by word_id where sum(n)=6
(Je nach RDBMS muß sum(n) auch noch zwischen select und from vorkommen.)

Zweite und dritte Forderung - Häufigkeit ausgewählter Buchstaben:

select word_id from letter_freq where letter='E' and n=2
select word_id from letter_freq where letter='R' and n=2

Gesamtergebnis sind dann alle Worte, deren IDs in allen drei Query-Ergebnissen vorkommen. Das kann man mit SQL ausdrücken, aber ich hab gerade eine Denkblockade.

Als Vorteil einer Auslagerung nach genanntem Muster sehe ich bei weiterem Nachdenken noch, dass ich mich nicht auf die zu verwendenden Buchstaben festlegen muss. Demnach können Wörter verschiedener Sprachen in einer Tabelle stehen. Sehe ich das so richtig?

Richtig. Mit der normalisierten Form kannst Du den gesamten Unicode-Bereich erschlagen, in der nicht normalisierten Form müßtest Du die Wort-Tabelle um ca. 100.000 (aktuell) bis ca. 1 Mio. (max.) Spalten erweitern.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".