SQL 2 tables, InnoDB und Fulltext, wie muss query aussehen?

D

dreivier

Gast
Ich Anfänger.

InnoDB, Fulltext, 2 Tabellen
Wie muss das query am besten aussehen, wenn ich jetzt etwas in Tabelle1 suche, es einen Treffer gibt, die Ausgabe aber so ausschaut das alles was aus Tabelle2 zu dem Treffer aus Tabelle1 gehört, mit ausgegeben wird?

Also in etwa sowas..
In Tabelle 1 befinden sich nur Städtenamen
In Tabelle 2 befinden sich Stadteile und Informationen zu diesen

Also, suche nach ,,BERLIN,, = 1 Treffer in Tabelle1 = schaue noch nach was in Tabelle2 zum Treffer in Tabelle1 passt und gebe die Datensätze dann aus.

Die dann zb. so ausschauen.

Berlin - Charlottenburg
Information zum Stadteil
Berlin - Friedrichshain
-//-
Berlin - Hohenschönhausen
-//-
Berlin - Kreuzberg
-//-
Berlin - Prenzlauer Berg
-//-
Berlin - Schöneberg
-//-
Berlin - Steglitz
-//-
Berlin - Tempelhof

8 Datensätze gefunden.
Berlin ist der Stadtname und kommt aus Tabelle1, alles andere kommt aus Tabelle2.

Ist bestimmt leicht oder? so nun der schwere Teil..

Wenn ich jetzt aber nach Kreuzberg suche sollte nur folgendes ausgegeben werden...
Berlin - Kreuzberg
Information zum Stadtteil
Dito wenn ich direkt nach Berlin Kreuzberg suche oder umgekehrt!

Merci
 
Hast du schon mal nach Join oder In gesucht? Ich meine das sind doch elementare SQL Operationen.
Es schadet auch nicht das Datenbank Schema zu zeigen, nur so für das nächste mal.
In dem Fall ist es egal, da die Lösung zu trivial ist, und du die Antwort beim Lesen über joins finden wirst
 
  • Gefällt mir
Reaktionen: GroMag
Ich kenne JOIN bzw. habe darüber gelsen, würde hier nicht fragen wenn ich herasugefunden hätte wie der query aussehen muss..ich habe hm..ca. fast eine Tag nur damit verbracht und jede mögliche Kombination versucht..geht nicht, nicht so wie hier beschrieben gewünscht.
Ich dachte Profis würden sowas ja aus dem ff wissen - habe ich mich wohl geirrt? ;)
 
Dann zeig doch mal Deine Query(s), dann kann man Dir auch konkreter helfen.

Dein Eingangsbeitrag liest sich nach "Das brauche ich, macht mal". Dementsprechend gab es auch den Hinweis auf join. Wenn Du so triviale Antworten nicht möchtest dann beschreib besser was Du bereits probiert hast. Niemand kann wissen was Du bereits an SQL-Befehlen kennst.
 
Zuletzt bearbeitet von einem Moderator:
@abcddcba:
Was ist denn die triviale Lösung? Ganz trivial scheint es mir nämlich nicht zu sein.
Das hier ist zumindest keine gute Lösung:

SQL:
SELECT
    Stadt.Name + ' ' + Stadtteil.Name
FROM Stadt
INNER JOIN Stadtteil
WHERE Stadt.Name + ' ' + Stadtteil.Name
LIKE '%Berlin Kreuzberg%';
 
  • Gefällt mir
Reaktionen: dreivier
@Lars337
Das nenn ich Hilfe oder der Versuch, ohne viel Gelaber. Leider habe ich das so auch schon probiert, die Ausgabe ist leider nicht wie oben gewünscht, ich danke dir trotzdem für die Mühe.
 
Die Ausgabe müsste eigentlich passen.
Es ist nur von der Performance her ein No-Go.

EDIT:
Also bis auf die fehlende JOIN-Bedingung versteht sich.
INNER JOIN Stadtteil ON Stadt.Id = Stadtteil.StadtId (oder wie auch immer die Tabellen aufgebaut sind).
Das Datenbankschema hast du ja nicht preisgegeben.
 
Zuletzt bearbeitet:
Die triviale Lösung ist folgendermaßen - note, "trivial" setzt voraus, daß die Daten normalisiert vorliegen, wovon ich anhand des Kontexts erstmal ausgehe:

A Tabelle Stadt
Hier gibts stadt_id (oä) und den Namen der Stadt.
B Tabelle Stadtteile
Hier gibt es stadtteil_id, stadt_id (aus Tabelle A oben) und den Namen des Stadtteils.

Damit sieht die Abfrage folgendermaßen aus:

SQL:
SELECT stadt.name, stadtteil.name -- , weitere, spalten
FROM stadt
JOIN stadtteil ON stadtteil.stadt_id = stadt.id
WHERE stadtteil.name = 'Kreuzberg'

Fehlen die IDs, dann sollten diese nach Möglichkeit nachgeholt werden bzw im Zweifel der Datenbankdesigner gelyncht werden.
 
  • Gefällt mir
Reaktionen: BFF
@RalphS

Das setzt aber voraus, dass es Kreuzberg nur in Berlin gibt.
Deshalb ja bei mir der Teil

...
WHERE Stadt.Name + ' ' + Stadtteil.Name
LIKE '%Berlin Kreuzberg%'

der allerdings bezüglich der Performance eben ein Nogo ist.

Um die JOIN-Bedingung ging es mir weniger, die vergesse ich beim skizzieren oft, wenn ich implizit von den Foreign-Keys ausgehe :D
 
Nein. Stadtteile sind per Spalte Stadt_ID in der Tabelle Stadtteile eindeutig verknüpft.
 
@Ralph...ich habe in beiden Tabellen eine Spalten [idt] diese haben immer eine Nummer, die Nummer einer Stadt passt immer zu der Nummer den Stadtteilen in Tabelle2, anhand dieser Nummer verbinde ich dann beide Tabellen mit JOIN, probiert mit On aber auch mit USING da Spalten gleichen Namen haben, funktioniert auch nur die Ausgabe ist nicht zufriedenstellend weil..gebe ich zb. Berlin Berlin in Suche ein, gibt es keinen Treffer.

EDIT: Ich überlege gerade, ob das am Fulltext Index liegen könnte?
 
Nicht ganz sicher wie Dein Schema aussieht... weil eine zusätzliche Spalte solltest Du nicht pauschal benötigen.

Verwendest Du bei der Abfrage den Tabellenamen mit? Falls nicht, könnte es daran schon liegen.

Ist auch die Frage was in den Tabellen steht. Berlin ist ja erstmal kein Stadtteil von Berlin, also kann das durchaus sein, daß so nichts gefunden wird.

Zur Sicherheit. Der Suchbegriff, was ist das genau? Der Name der Stadt, oder (nur) der Name des Stadtteils, beides zusammen, oder noch was anderes?
 
In solchen Fällen wäre die WHERE Klausel um AND stadt.name = 'Berlin' zu erweitern.

Deswegen auch meine Frage weiter oben, exakt was für eine Anfrage an die DB gestellt wird. Wenn man nach zB Kreuzberg sucht, dann muß man ganz einfach davon ausgehen, daß mehrere Städte so einen Stadtteil haben. Was wenn nach "Mitte" gesucht wird?

Was bleibt ist eine allgemeine Ordnung auf den Städtenamen, die dann rauskomen - zB alphabetisch oder ggfs was anderes.

Oder man fragt wirklich bspw. nach dem String "Berlin Kreuzberg". Das würde ich aber vermeiden wollen und "stadt" dessen zwei Eingabefelder bereitstellen.

Ansonsten wird's nämlich mehrdeutig, wenn Städte und/oder Stadtteile Leerzeichen mitbringen.
 
RalphS schrieb:
In solchen Fällen wäre die WHERE Klausel um AND stadt.name = 'Berlin' zu erweitern.

Dann müsstest du aber wissen, welcher Teil des Suchbegriffs zu welcher Entität gehört.
Die Suche nach "Berlin" wäre eine Suche nach Stadt.
Die Suche nach "Kreuzberg" die Suche nach Stadtteil
Die Suche nach "Berlin Kreuzberg" wäre eine Suche nach beidem.

Ich sehe nicht, wie man mittels
WHERE Stadt.Name = ?
AND Stadtteil.Name = ?

eine Volltextsuche hinbekommt.
 
Also ich erwarte sowas als Ausgabe...

Ich gebe ,,BERLIN,, in das Formular ein:: die Ausgabe presentiert mir Berlin, alle Stadteile und die Beschreibungen zu den jeweiligen Stadteilen.

Ich gebe ,,BERLIN KREUZBERG,, in das Formular ein:: die Ausgabe presentiert mir nur Berlin - Kreuzberg und die Beschreibung zu dem Stadtteil.

Ich gebe ,,Kreuzberg,, in das Formualr ein:: die Asugabe presentiert mir alle Städte mit dem Stadteil Kreuzberg und die Beschreibungen zu den Stadteilen.

Ich gebe BERLIN BERLIN in das Formular ein:: die Suche ignoriert das doppelte Wort und gibt wie im ersten Beispiel Berlin und alle Stadtteile aus.

Nur Berlin also nur Stadt oder nur Stadteil soll nie ausgegeben werden, wäre ja auch irgendwie blöd...die letzte Variante ist nur um Fehler abzufangen, denn wie soll ich sowas abfangen wenn jemadn im Formular rumspielt und nur Berlin oder tausendmal Bonn eingibt?

Hier wie die Tabellen aufgebaut sind:

Code:
Tabelle ,,staedte,,
Spalten:
id int(11) //primary key unique
name varchar(50)
idt int(11) //

Tabelle ,,stadtteile,,
Spalten:
idt int(11) //primary key unique
stadtteil varchar(100)
stadtteilinfo text(2000)

name, stadtteil, stadtteilinfo haben fulltext index
Ich habe es zurzeit so das ich via INNER JOIN und USING(idt) die Tabellen verbinde.

Wenn das Mist sein soll und es eleganter/besser geht, bitte melden...danke..

Erwähnen würde ich aber noch, das ich noch eine Spalte erstellen werde mit info der ganzen Strassennamen in einem Stadtteil, dann muss also auch nach Strassenamen geschaut werden..das wird dann auch eine Text Spalte mit Fulltext Index.
 
Zuletzt bearbeitet von einem Moderator:
Das ist jetzt mal Pseudocode wie es gehen könnte, als Idee. Wie man Einträge in einem Array findet, ist evtl DB a.bhängig

Code:
STRINGARRAY = SUCHSTRING SPLIT ; also den in ein array gesplitten Suchstring statt dem Platzhalter
hier setzen, wie das genau geht musste mal schauen, sollte aber kein Ding sein. 
(Ich mach aktuell nur Postgres SQL. ;))

SELECT staedte.name, stadtteile.stadtteil , stadtteile.stadtteilinfo
FROM staedte
JOIN stadtteile ON stadtteile.idt = staedte.idt
WHERE stadtteile.stadtteil IN STRINGARRAY
OR staedte.name IN STRINGARRAY;
 
Zuletzt bearbeitet:
Lar337 schrieb:
Bei einer Volltextsuche nach "Berlin Kreuzberg" würde in deiner Query auch Nicht-Berlin Kreuzberg ausgeben.
Ich suche hier immer noch die Fulltext-Suche (LIKE %*% ist keine).
 
  • Gefällt mir
Reaktionen: dreivier
@KingLz
Warum ON wenn es doch zwei identische Spaltennamen sind (idt) die zueinander passen? USING ist doch genau dafür gedacht. Oder habe ich das falsch verstanden?
 
Zurück
Oben