# sql-statement



## jollyroger (28. Feb 2006)

hey leute,

ich hoffe hier kann mir einer mit meinen doch sehr eingestaubten sql-kenntnissen auf die sprünge helfen...

ich hab folgende einfache tabelle (mysql 4.1.18):

word | doc_id | frequenz | position
___________________________________
bla | xxx | 3 | 4,44,55
bla | yyy | 2 | 6,78
blub | xxx | 1 | 18
blub | yyy | 1 | 3

die tabelle sagt mir einfach das wort "bla" in document "xxx" so und so oft vorkommt und an was für einer position.

mein problem nun:

wie müsste das sql-statement aussehen für die frage:

"welches sind die 10 häufigsten worte in der tabelle, unabhängig in was für einem document die stehen"?

mit anderen worten:

- bilde von jedem wort in der tabelle die summe seiner frequenz in allen dokumenten
- liefere mir zu den 10 größten summen das entsprechende wort zurück

stehe ziemlich aufm schlauch gerade,

danke für jede hilfe!


----------



## AlArenal (28. Feb 2006)

Für so nen Tabellenaufbau gehört man verprügelt! 

Viel schicker wäre es, in der tabelle ne id zu führen und die positionen in einer zweiten tabelle (id|word_id|frequenz) zu führen und das zu verknüpfen.

Die Frage "welches sind die 10 häufigsten worte in der tabelle, unabhängig in was für einem document die stehen?"  haste mal völlig misinterpretiert und die Antowrt lautet


```
SELECT frequenz, word FROM tabelle ORDER BY frequenz ASC LIMIT 10
```


----------



## AlArenal (28. Feb 2006)

P.S.:
Das hat aber nüscht mit JDBC zu tun


----------



## jollyroger (28. Feb 2006)

> Das hat aber nüscht mit JDBC zu tun



sql hat nix mit jdbc zu tun?



> Für so nen Tabellenaufbau gehört man verprügelt! icon_wink.gif



is nicht auf meinem mist gewachsen....



> Die Frage "welches sind die 10 häufigsten worte in der tabelle, unabhängig in was für einem document die stehen?" haste mal völlig misinterpretiert



du hast auch schon gelesen was ich geschrieben habe bevor auf "antwort erstellen" geklickt hast oder?

deine query listet mir die häufigkeit für jedes dokument auf, wie ich in der eröffnung geschrieben hatte will ich wissen welche worte insgesamt am häufigsten vorkommen.

hab mittlerweile rausbekommen wie



```
select name, sum(frequency) as summe from word_in_doc group by name order by summe desc limit 10;
```


----------



## AlArenal (28. Feb 2006)

JDBC hat mit SQL zu tun, umgekehrt gilt das nicht automatisch. In PHP kann ich prima mit SQL arbeiten und nirgends hab ich was mit JDBC zu tun. JDBC aber bringt mir natürlich nur was, wenn ich beabsichtige SQL zu nutzen.

Zurück zur eigentlichen Frage:
In der Tat, deine Wörter können ja mehrmals in unterschiedlichen Docs vorkommen, da hatte ich nicht aufgepasst. In solchen Fällen hab ich früher in MySQL mit temporären Heap-Tabellen gearbeitet. Da hab ich erstmal die Zusammenfassung (die Addition in deinem Fall) reingehauen und den Krims dann sortiert ausgegeben. Mittlerweile habe ich selten noch was direkt mit SQL am Hut und es gibt endlich auch in MySQL Subselects, mit denen du das sicher eleganter lösen kannst.


----------



## AlArenal (28. Feb 2006)

P.S.:

Seit der 5er Version kann MySQL ja auch endlich mal Trigger (Freunden ausgewachsener RDBMS mag das ein müdes Lächeln abringen), die sich hier anböten um bei einer Änderung in der Tabelle automatisch in einer anderen Tabelle die Summen zu updaten/upzudaten/zu erneuern (scheiß Denglisch)...


----------



## KSG9|sebastian (28. Feb 2006)

SELECT count(word) as word_count FROM tabelle GROUP BY word_count ORDER BY word_count DESC LIMIT 0, 10


so müsste es gehen...


----------



## AlArenal (28. Feb 2006)

COUNT() zählt doch die Anzahl der Reihen!? Ich denke, er müsste was mit SUM() oder so machen, aber dann gibts hinten beim Sortieren den altgedienten "bla bla can not use with aggregate function bla bla"...


----------

