SQLite Abfrage über mehrere Tabellen

Gast #2926166
Hallo allerseits,

es ist schon eine Weile her, dass ich mal was mit MySQL gemacht habe. 
Ich möchte eine kleine Wörterbuchanwendung schreiben, und habe folgendes 
Schema angedacht:

               Beispieldaten
words
 id        0       1       2
 word      "hallo" "hello" "hola"
 lang      "de"    "en"    "es"

links
 id        0 1
 word_id1  0 0
 word_id2  1 2


Kommt man bei diesem Schema mit einer Abfrage aus, um alle Übersetzungen 
eines Wortes zu ermitteln?
Noch schwieriger ist dann ja die Abfrage nach "hello" -> "hallo", "hola"


Ein erster Anfang
1
SELECT * 
2
FROM words
3
JOIN links
4
     ON (words.id = links.word_id1 OR words.id = links.word_id2 )
5
WHERE word = "hallo"

Aufgrund des JOIN müssen auf jeden Fall noch die Suchergebnisse 
eingeschränkt werden..
#2926218
Du mußt die Tabelle words in der Query zweimal verwenden, einmal für die 
Quellsprache und einmal für die Zielsprache(n):
1
SELECT *
2
FROM words wfrom
3
JOIN links
4
     ON ( wfrom.id = links.word_id1 OR wfrom.id = links.word_id2 )
5
JOIN words wto
6
     ON ( links.word_id1 = wto.id OR links.word_id2 = wto.id )
7
WHERE wfrom.word = "hallo"
8
  AND wfrom.lang != wto.lang

Damit bekommst Du in Deiner Beispieldatenbank zwei Ergebniszeilen, eine 
für hallo -> hello und eine für hallo -> hola. Die letzte Zeile des 
Statements schließt aus, daß Du auch noch eine für hallo -> hallo 
bekommst.

> Aufgrund des JOIN müssen auf jeden Fall noch die Suchergebnisse
> eingeschränkt werden..

Das machen ja bereits die ON-Klauseln.
Gast #2926232
Dein Schema ist ein bisschen gar kompliziert. Mach doch einfach eine 
Tabelle mit den Spalten:
- id
- en
- de
- es

Oder, wenn es denn sein muss:
- id
- key (z.B. das Wort auf Englisch)
- lang (z.B. "de")
- word (z.B: "Hallo")
#2926246
Self schrieb:
> Mach doch einfach eine Tabelle mit den Spalten:
> - id
> - en
> - de
> - es

Das sieht auf den ersten Blick einfacher aus, aber um eine weitere 
Sprache hinzuzufügen, muß man gleich das Schema (und damit i.d.R. auch 
den SQL-Code der darauf zugreift) ändern.
#2926300
linguist schrieb:
> Beispieldaten
> words
>  id        0       1       2
>  word      "hallo" "hello" "hola"
>  lang      "de"    "en"    "es"
>
> links
>  id        0 1
>  word_id1  0 0
>  word_id2  1 2

üblicherweise stellt man Datensätze untereinander da

Ich würde für die Sprache auch eine eigene Tabelle bauen und in words 
nur die langs.id referenzieren.
langs
id  lang
0   "de"
1   "en"

alle Übersetzungen eines Wortes zu ermitteln ist mit einer Abfrage 
nicht möglich.
da ja eine Verbindung en-es auch über en-de und de-es möglich sein 
könnte.
Du kannst natürlich eine Mastersprache definieren, so dass word_id1 
immer auf die Übersetzung in der Mastersprache referenziert.
Dann kannst du in die du in der ersten Stufe der Abfrage die 
Übersetzungen in die Mastersprache holen und in der zweiten Stufe der 
Abfrage alle Übersetzungen.
Die Frage ist natürlich wie präzise diese Übersetzungen denn wären.
Such mal auf Leo nach einem Wort und übersetze dann alle Ergebnisse 
zurück in die Ausgangssprache. Der so entstandenen Baum wird nicht sehr 
zufriedenstellend sein.

Einfach nur ohne diese Kettenübersetzungen ist die Abfrage einfach, wie 
R. Max es gezeigt hat.
#2926331
Einfacheres Schema:

words
 id        0       0       0      1       1
 word      "hallo" "hello" "hola" "merde" "shit"
 lang      "de"    "en"    "es"   "fr"    "en"

select word, lang
  from words
 where id = (select id from words where word = "hallo" and lang = "de")
   and lang <> "de"
Gast #2927922
Vlad Tepesch schrieb:
> alle Übersetzungen eines Wortes zu ermitteln ist mit einer Abfrage
> nicht möglich.
> da ja eine Verbindung en-es auch über en-de und de-es möglich sein
> könnte.

Deswegen bin ich nochmal hier. Das geht mit obigem JOIN nämlich nicht. 
Ich hatte zwischendurch auch eine Abfrage mit subqueries. Und die 
Sprachen sind auch schon in einer eigenen Tabelle..
Evtl. kann man die "links" wichten.

Na, jedenfalls komm' ich langsam wieder ins Thema.
Danke auch für eure Beiträge!
Gast #2929943
R. Max schrieb:
> Self schrieb:
>> Mach doch einfach eine Tabelle mit den Spalten:
>> - id
>> - en
>> - de
>> - es
>
> Das sieht auf den ersten Blick einfacher aus, aber um eine weitere
> Sprache hinzuzufügen, muß man gleich das Schema (und damit i.d.R. auch
> den SQL-Code der darauf zugreift) ändern.

Kommt darauf an was man will. Akademisch richtig ist es nicht. Dafür 
einfach, schnell (auch für die Datenbank) und übersichtlich. Und den 
SQL-Code kann man auch hier generisch schreiben. Von einem praktischen 
Standpunkt aus also durchaus zu überlegen.
Gast #2935337
Vlad Tepesch schrieb:
> Unterbezahlt schrieb:
>> Dafür
>> einfach, schnell (auch für die Datenbank)
>  und wie sieht es aus, wenn es mehrere Übersetzungen für ein Wort gibt?
> wieviele de, en und es Spalten willst du denn dann noch an die Tabelle
> hängen?
>
> Sowas ist einfach Murks.

Das kannst du so nicht sagen. Es kommt darauf an, was man erreichen 
will. Wenn es eine Übersetzungstabelle für ein Programm werden soll, 
dann legt man eben für jede Wortbedeutung einen Eintrag in allen 
Sprachen ab.
Das ist wir gesagt super einfach, flott, wartbar und durchschaubar. Man 
muss nicht alles überkompliziert machen. Da sind mehrfache Joins für so 
eine einfache Aufgabe vollkommen unnötig und überdimensioniert. Und ist 
daher meiner Meinung nach der eigentliche Murks. Einen guten Entwickler 
zeichnen gerade solch einfache Lösungen aus, wenn sie ausreichend sind.
#2936168
SQLo schrieb:
> Das kannst du so nicht sagen. Es kommt darauf an, was man erreichen
> will. Wenn es eine Übersetzungstabelle für ein Programm werden soll,
> dann legt man eben für jede Wortbedeutung einen Eintrag in allen
> Sprachen ab.

auch für sowas ist es Murks.
Was ist, wenn jemand die Unterstützung für eine weitere Sprache 
hinzufügen will?
Da muss das Tabellenlayout geändert werden - super!

SQLo schrieb:
> Das ist wir gesagt super einfach, flott, wartbar und durchschaubar.
wartbar ist das definitiv nicht, wenn durch hinzufügen einer Sprache die 
Tabelle angepasst werden muss. Wartbar ist, wenn nur ein paar Einträge 
dazu kommen.

flott?
Ich würde wetten, dass nahezu kein Unterschied messbar ist.

SQLo schrieb:
> Einen guten Entwickler zeichnen gerade solch einfache Lösungen aus,
Bitte nicht "einfache Lösungen" mit Murks gleichsetzen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.