Bobby: komplexere MySQL-Abfrage

Moin

Ich habe eine komplexe Abfrage die nicht richtig funktioniert. Ich weiß aber nicht so richtig warum

  
SELECT  
  Typ,  
  Anzahl,ID,  
  Name,  
  Beschreibung  
  FROM  
  (  
    (  
       SELECT  
         'Datentyp1' AS Typ,  
         (  
           SELECT  
           COUNT(*) FROM Datentyp1  
           WHERE MATCH (Name, Beschreibung)  
           AGAINST (' +test*' IN BOOLEAN MODE)  
         )  
         AS Anzahl,  
         Datentyp1_ID AS ID,  
         Name AS Name,Beschreibung AS Beschreibung  
         FROM  
         Datentyp1  
         LEFT JOIN  
           Schlagwort ON  
           (  
             MATCH (Schlagwort)  
             AGAINST (' +test')  
             IN BOOLEAN MODE  
           )  
         LEFT JOIN  
           `Datentyp1-Schlagwort` ON  
           (  
             `Datentyp1-Schlagwort`.Schlagwort_ID = Schlagwort.Schlagwort_ID  
           )  
         WHERE  
           MATCH (Name, Beschreibung)  
           AGAINST (' +test'  
           IN BOOLEAN MODE)  
         OR  
           `Datentyp1-Schlagwort`.Datentyp1_ID = `Datentyp1`.Datentyp1_ID  
       ORDER BY Name ASC LIMIT 0,3  
     )  
 )  
 AS comtable  

Die Fehlermeldung lautet:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BOOLEAN MODE) LEFT JOIN Datentyp1-Schlagwort ON (Datentyp1-Schlagwort.Schl' at line 1

Die Abfrage muss genaui so zusammengebaut werden, da es sich hier um 10 Datentypen handelt, die per Union zusammengeschlossen werden. Aber eine einzelne Abfrage auf einen Datentyp passt schon nicht. Darf ich kein MATCH in LEFT JOINS ausführen?

Datenbankversion: 5.0.51 MyIsAM und der Fulltext-index ist auch richtig gesetzt. Wer entdeckt meinen Denkfehler?

Gruß Bobby

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
-> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  1. Moin

    ich habe bei

      
      
             LEFT JOIN  
               Schlagwort ON  
               (  
                 MATCH (Schlagwort)  
                 AGAINST (' +test')  
                 IN BOOLEAN MODE  
               )  
    
    

    jetzt IN BOOLEAN MODE entfernt und da funktionierts. Warum darf ich im LEFT JOIN  nicht im BOOLEAN MODE suchen?

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. echo $begrüßung;

      ich habe bei [...]
      jetzt IN BOOLEAN MODE entfernt und da funktionierts. Warum darf ich im LEFT JOIN  nicht im BOOLEAN MODE suchen?

      Doch, darfst du. Du musst nur die Syntax einhalten. Bei deiner ersten und dritten Anwendung von MATCH AGAINST machst du es ja auch richtig.

      echo "$verabschiedung $name";

      1. Moin

        Doch, darfst du. Du musst nur die Syntax einhalten. Bei deiner ersten und dritten Anwendung von MATCH AGAINST machst du es ja auch richtig.

        Ich Dussel, Danke. Hatte IN BOOLEAN MODE außerhalb der Klammer notiert... man man man...

        Naja manchmal ist man Betriebsblind..

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
        -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
        ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        1. yo,

          Naja manchmal ist man Betriebsblind..

          vielleicht noch als tipp, formatierungen sind ja immer ein wenig individuell, aber ich finde deine ein wenig schwierig zu lesen und deswegen kommt so was auch schon mal vor. so klammerst du zum beispiel die Unterabfrage in der ersten FROM klausel doppelt, benutzt den AS zusatz bei alias namen (was ich grundsätzlich weglassen würde), keine guten zeilenumbrüche nach SELECT, so dass COUNT (*) FROM in einer zeile steht, die verwendung von Name AS Name ist auch nicht gerade hilfreich, etc.

          ich denke, bei einer besseren formatierung würdest du dir einige fehler ersparen.

          Ilja

          1. Moin

            Das rührt alles daher, das ich nicht nur einen Datentyp sondern per UNION mehrere Datentypen abfrage. Diese Ergebnisse fasse ich in der virtuellen Tabelle "comtable" zusammen.  Dort müssen natürlich bestimmte Datenfelder den gleichen Alias bekommen. Und der "Name" heißt nicht in jeder Tabelle "Name" Und die doppelte Klammerung würde mit einem Union auch für dich klar sein.

            Wie meinst du das? das du Aliase grundsätzlich weglassen würdest? Wenn in 2 Tabellen je eine Spalte Name existiert wird die Spalte doch überschrieben in der Ausgabe. Ich hoffe du verstehst was ich meine.

            Gruß Bobby

            --
            -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
            -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
            ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
            1. yo,

              Das rührt alles daher, das ich nicht nur einen Datentyp sondern per UNION mehrere Datentypen abfrage.

              mir ist ein wenig schleierhaft, was du mit abfragen von datentypen meinst. auch sehe ich in deiner abfrage kein UNION, insofern ist es ein wenig abstrakt darüber zu reden. aber fakt ist, die abfrage die du hier angegeben hast, ist meiner meinung nach schlecht formatiert und da liegt der schluss nahe, dass man grundsätzlich fehler mit einer besseren formatierung vermeiden kann. gerne kannst du ja auch mal die gesamte abfrage zeigen, falls da noch was fehlt.

              Wie meinst du das? das du Aliase grundsätzlich weglassen würdest? Wenn in 2 Tabellen je eine Spalte Name existiert wird die Spalte doch überschrieben in der Ausgabe. Ich hoffe du verstehst was ich meine.

              nicht wirklich, aber ich meinte auch, dass man das "AS" grundsätzlich weglassen sollte und nicht, dass man keine aliasnamen verwendet.

              Ilja

              1. Moin

                mir ist ein wenig schleierhaft, was du mit abfragen von datentypen meinst. auch sehe ich in deiner abfrage kein UNION, insofern ist es ein wenig abstrakt darüber zu reden. aber fakt ist, die abfrage die du hier angegeben hast, ist meiner meinung nach schlecht formatiert und da liegt der schluss nahe, dass man grundsätzlich fehler mit einer besseren formatierung vermeiden kann. gerne kannst du ja auch mal die gesamte abfrage zeigen, falls da noch was fehlt.

                Die Formatierung seh ich ein war nicht sonderlich gut. Die UNION Abfragen hatte ich weggelassen, da diese in einer Schleife erstellt werden. und wenn schon 1 Datentyp nicht klappt, dann klappen die andern auch nicht. So reichte doch das Posting eines DAtentypes. Mit Datentypen ist die Suche über mehrere Tabellen und die Zusammenfassung in einer Tabelle gemeint. Die Abfrage funktioniert nun einwandfrei. Es erfolgt eine Volltextsuche direkt auf den Datentypetanbellen und es existiert nun eine Verknüpfung zu den Suchwörtern, die extra durchsucht werden. Von daher Danke für die Hilfe.

                nicht wirklich, aber ich meinte auch, dass man das "AS" grundsätzlich weglassen sollte und nicht, dass man keine aliasnamen verwendet.

                Wie erzeuge ich dann Aliase? Man lernt nie aus.

                Gruß Bobby
                ___
                PS: Einloggsystem hier im Forum geht nicht.

                1. yo,

                  Mit Datentypen ist die Suche über mehrere Tabellen und die Zusammenfassung in einer Tabelle gemeint.

                  oha, diese bezeichnung ist mir gänzlich neu. ich finde sie ein wenig "unglücklich", weil ich mit datentypen im kontext von datenbanken immer an datentypen ala INTEGER oder VARCHAR denke. letztlich handelt es sich bei dir um ganz normale Joins innerhalb der FROM klausel. ich habe auch ein wenig den verdacht, das selbst die Unterabfrage überflüsig ist. aber ohne deine genaue abfrage zu kennen, kann man das nicht wirklich beurteilen.

                  Wie erzeuge ich dann Aliase? Man lernt nie aus.

                  indem du das AS einfach wegläßt, es ist optional und nicht bei jedem dbms auch erlaubt. so wird oracle dich zum beispiel bei tabellen-aliasnamen als unterabfrage anmeckern, wen du dort ein AS benutzt. auch braucht man die ON klausel nicht zu klammern. aber am besten ein einfaches beispiel.

                  SELECT tab1.spalte1 Vorname, tab1.spalte2 Nachname, tab2.spalte4 Adresse
                  FROM langer_tabellenname1 tab1
                  INNER JOIN langer_tabellenname2 tab2 ON tab2.spalte_FK = tab1.spalte_PK
                  WHERE tab1.spalte_Ort = 'Hamburg'
                  ;

                  Ilja

                  1. Moin

                    letztlich handelt es sich bei dir um ganz normale Joins innerhalb der FROM klausel. ich habe auch ein wenig den verdacht, das selbst die Unterabfrage überflüsig ist. aber ohne deine genaue abfrage zu kennen, kann man das nicht wirklich beurteilen.

                    Welche Unterabfrage meinst du? Den ganzen Query kann ich nicht ausgeben, da dieser (aufgrund verschiedener Abfrage) nicht formatiert und viel zu lang (über 9000 Zeichen) ist . Wie kann man sich sowas formatiert ausgeben lassen?

                    indem du das AS einfach wegläßt, es ist optional und nicht bei jedem dbms auch erlaubt. so wird oracle dich zum beispiel bei tabellen-aliasnamen als unterabfrage anmeckern, wen du dort ein AS benutzt. auch braucht man die ON klausel nicht zu klammern. aber am besten ein einfaches beispiel.

                    Ja danke... Habs probiert. Finde ich aber unübersichtlicher wenn ich ehrlich bin. ;-)

                    Gruß Bobby

                    --
                    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
                    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
                    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)