Announcement

Collapse
No announcement yet.

2 Tabellen verknüpfen, Volltextsuche in Tabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2 Tabellen verknüpfen, Volltextsuche in Tabelle

    Hallo,

    heute haben sich zwei Fragen ergeben, auf die ich noch keine Lösungen gefunden habe. Die Abfragen möchte ich übrigens in PHP realisieren. Evntl. stößt mich hier jemand auf die richtige Lösung oder hat gute Links zu Tutorials, Beispielen, Schlagwörtern oder SQL-Statements. (Vielleicht auch ein Link zu einem Thread, der eins der Themen behandelt, konnte leider keinen finden)

    Zu meinen Fragen:

    1.) Ich habe 2 Tabellen BILDER und TEAMS. Die Tabelle BILDER beinhaltet neben allgemeinen Informationen zu verschiedenen Bilddateien auch zwei Felder TEAM1_ID und TEAM2_ID. Die Tabelle TEAMS beinhaltet verschiedene Informationen wie NAME oder KATEGORIE zu Teams. Jedes Team hat außerdem eine ID, die auch der Primärschlüssel ist (und die ich mit den TEAM-IDs aus BILDER vergelichen will)

    Ich möchte nun eine Abfrage erstellen, die Ergebnisse aus BILDER ausgibt und gleichzeitig die IDs (TEAM1_ID und TEAM2_ID) aus der Tabelle TEAMS abfragt und mir das Feld NAME passend dazu ausgibt.

    TEAMS:
    ---------
    id | name | kategorie | ..... |
    ----------------------------------
    1 | n1 | kat1 | ...... |
    2 | n2 | kat2 | ...... |
    3 | n3 | kat1 | ...... |
    4 | n4 | kat2 | ...... |

    BILDER:
    ----------
    team1_id | team2_id | beschreibung | ..... |
    ------------------------------------------------------
    1 | 3 | beschr1 | ..... |
    2 | 4 | beschr2 | ..... |
    0 | 0 | beschr3 | ..... |
    4 | 3 | beschr4 | ..... |

    Folgende Abfrage habe ich (Ich gebe die Abfrage aus dem Kopf wieder, daher kann sie auch leicht anders sein..:

    SELECT
    b.*,
    t.name AS team1_name,
    t.name AS team2_name
    FROM BILDER AS b, TEAMS AS t
    WHERE (b.id = team2_name)
    AND (b.id = team1_name)

    Die Abfrage funktioniert soweit, dass zu jedem BILDER Datensatz in der die beiden TEAM1_ID und TEAM2_ID nicht 0 sind, die entsprechenden Ergebnisse mit den Namen aus TEAMS ausgegeben werden. Allerdings sind die Felder TEAM1_ID und TEAM2_ID keine Pflichtfelder in der BILDER Tabelle. Falls also kein Bezug zu einem Team angelegt ist, ist die ID jeweils 0.

    ERGEBNISS (So soll es sein):
    ----------
    team1_id | team2_id | beschreibung | ..... | team1_name | team2_name
    -----------------------------------------------------------------------------------------
    1 | 3 | beschr1 | ..... | n1 | n3
    2 | 4 | beschr2 | ..... | n2 | n4
    0 | 0 | beschr3 | ..... | | <--- Dort ist der "Fall 0"
    4 | 3 | beschr4 | ..... | n4 | n3

    Die Frage ist nun, wie man es Richtig macht, bzw. wo mein/e Fehler liegt/liegen.

    2) Mein zweites Problem ist eventuell etwas umfangreicher. Es geht wieder um die oben beschriebenen Tabellen. Und zwar möchte ich eine Volltextsuche über ein Feld von BILDER realisieren - Das Feld heißt beschreibung. Eine Suche mit LIKE funktioniert zwar, aber das Feld Beschreibung kann auch (mehrere) allgemeine Stichworte enthalten, was eine Volltextsuche Sinnvoller macht. Meine Vorgehensweise ist vor jeder Datenbankabfrage die folgende:

    1. Zunächst update ich die Tabelle ($sql_query ="ALTER TABLE BILDER ADD FULLTEXT(beschreibung)")
    2. Dann frage ich die Tablle (ungefähr so) ab: "SELECT * FROM BILDER WHERE MATCH(beschreibung) AGAINST ('MEIN SUCHSTRING');

    Die Suche führt allerdings zu keinen Ergebnisse, worin auch mein Problem liegt...

    Vielen Dank für alle Sachdienlichen Hinweise,

    Marcus
    Zuletzt editiert von marc0s; 02.03.2011, 21:11.

  • #2
    Hallo,
    Originally posted by marc0s View Post
    ...Folgende Abfrage habe ich (Ich gebe die Abfrage aus dem Kopf wieder, daher kann sie auch leicht anders sein..:

    SELECT
    b.*,
    t.name AS team1_name,
    t.name AS team2_name
    FROM BILDER AS b, TEAMS AS t
    WHERE (b.id = team2_name)
    AND (b.id = team1_name)
    Diese Abfrage kann so nie funktionieren! Auch solltest du Code so posten wie er verwendet wird und nicht "leicht anders", sonst kann dir keiner vernünftig helfen.
    Dein Problem sollte sich mit OUTER JOIN lösen lassen:
    [highlight=sql]
    SELECT
    b.*,
    t1.name AS team1_name,
    t2.name AS team2_name
    FROM BILDER AS b
    outer join TEAMS AS t1 on t1.id = b.team1_id
    outer join TEAMS AS t2 on t2.id = b.team2_id
    [/highlight]

    Originally posted by marc0s View Post
    ...1. Zunächst update ich die Tabelle ($sql_query ="ALTER TABLE BILDER ADD FULLTEXT(beschreibung)")
    2. Dann frage ich die Tablle (ungefähr so) ab: "SELECT * FROM BILDER WHERE MATCH(beschreibung) AGAINST ('MEIN SUCHSTRING');

    Die Suche führt allerdings zu keinen Ergebnisse, worin auch mein Problem liegt...
    Du brauchst den Fulltext-Index nur EINMAL anlegen und nicht vor jeder Abfrage.
    Was bedeutet "führt allerdings zu keinen Ergebnisse"? Bekommst du einen Fehler, wird nicht das gewünschte gefunden oder was?

    Und bitte beachten: Formatierung von SQL in Beiträgen

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      vielen Dank für deine Antwort zu meinen Fragen.

      Zu 1) bin ich auf die Lösung heute morgen nach genauerer Recherche selbst gekommen. Die Implementierung ist identisch und funktioniert auch wunderbar. Danke!

      Zu 2). Die Indices habe ich jetzt einmal in der Tabelle für die relevanten Suchspalten (beschreibung und kategorie) in Tabelle BILDER angelegt. Die Suche funktioniert soweit ich das überprüfen konnte auch zuverlässlich. (Edit: Es lag am falschen Table-Format, nach einer Umstellung auf MyISam geht es)

      Code:
      SELECT
      b.*,
      t1.name AS team1_name,
      t2.name AS team2_name
      FROM BILDER AS b
      OUTER JOIN TEAMS AS t1 ON t1.id = b.team1_id
      OUTER JOIN TEAMS AS t2 ON t2.id = b.team2_id
      WHERE MATCH (b.beschreibung) AGAINST ('suchwort')
      OR MATCH (b.kategorie) AGAINST ('suchwort')
      Kann man die Suche auch insoweit verfeinern, dass auch Wortteile gesucht werden? Also ich bei Eingabe von 'ung' auch Ergebniss wie 'Bildung', 'ungern' oder 'Lunge' ausgibt. In etwa wie ein LIKE %suchwort%.

      Oder macht es evntl auch mehr Sinn die Suche per LIKE zu realisieren. Der Unterschied ist, soweit ich richtig gelesen habe ja, dass der FULLTEXT Index mehr Speicherplatz verbraucht, wohingegen LIKE mehr Last erzeugt, da jeder Datensatz durchsucht wird.

      Die Beschreibung in der ich Suchen will, besteht zum Teil aus vielen Stichwörtern (z.B. Ort Straße Motiv PersonX PersonY). Insofern würde eine Suche mit den Suchbegriff 'Motiv Ort' mittels LIKE ja kein Ergebnis liefern, aber MATCH AGAINST schon.

      Danke und Gruß, Marcus

      Edit: Ich habe meine MATCH AGAINST Statements nun mit IN BOOLEAN MODE ergänzt, was die Filtergrenze von 50% aufhebt. Gerade bei den Kategorien kann es vorkommen, dass bestimmte Kategorien sehr oft vorkommen.
      Zuletzt editiert von marc0s; 04.03.2011, 16:54. Reason: Neue Erkenntnisse

      Comment

      Working...
      X