Announcement

Collapse
No announcement yet.

Trotz GROUP BY alle gejointen Einträge durchsuchen

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

  • Trotz GROUP BY alle gejointen Einträge durchsuchen

    Hallo,
    zugegeben, der Beitragstitel ist etwas unglücklich formuliert, kann ich nicht besser beschreiben ..

    Und zwar habe ich folgende SQL-Abfrage:

    [highlight=sql]SELECT t.tag,e.id,e.title,
    (MATCH(e.title) AGAINST ('+Suchbegriff')) as score_event,
    (MATCH(t.tag) AGAINST ('+Suchbegriff')) as score_tags,
    (MATCH(c.name) AGAINST ('+Suchbegriff')) as score_county FROM events e
    JOIN tags_rels tr ON (tr.entry_id = e.id AND tr.type = 'e')
    JOIN tags t ON t.id = tr.tag_id
    JOIN counties c ON c.id = a.county_id
    WHERE ((MATCH(e.title) AGAINST ('+Suchbegriff' IN BOOLEAN MODE))
    OR (MATCH(t.tag) AGAINST ('+Suchbegriff' IN BOOLEAN MODE))
    OR (MATCH(c.name) AGAINST ('+Suchbegriff' IN BOOLEAN MODE)) )
    GROUP BY e.id
    ORDER BY (score_event+score_tags+score_county) DESC;[/highlight]

    Es werden quasi der Titel einer Veranstaltung nach dem Suchwort durchsucht (events.title), außerdem der Name der Stadt (counties.name) und außerdem sollen alle Tags, mit denen die Veranstaltung verknüpft ist (über die Verknüpfungstabelle tags_rels) durchsucht werden. Das können beliebig viele sein.
    Und damit zu meinem eigentlichen Problem: Durch das "GROUP BY e.id" scheint immer nur der erste Tag, mit dem die Veranstaltung verknüpft ist durchsucht zu werden, nicht aber die restlichen. Nehme ich das GROUP BY e.id weg, werden alle durchsucht, aber ich bekomme eben auch im Zweifel so oft die selbe Veranstaltung als Ergebnis, wie tags vorhanden sind ..

    Gibt es da eine Lösung? Ich hoffe, ich konnte es verständlich erklären ..

    Vielen Dank schonmal!

    Johannes
    Zuletzt editiert von herlos; 19.04.2012, 16:26.

  • #2
    1. Dein Statement ist etwas durcheinander, zuviele OR im Where
    2. Es gibt auch hier im Forum die Möglichkeit, Zeilenumbrüche zu nutzen.
    3. Group by gruppiert den Inhalt, es filtert nicht, also kann das eigentlich nicht sein, was Du schreibst
    4. Da es sich vermutlich um mySQL handelt, fällt mir spontan wieder das tolle Defaultverhalten von mySQL zu Group By ein. Leider wieder den Begriff vergessen oder nie gemerkt.

    Falk hat das schon mal schön beschrieben. Um's kurz zu machen, gib eine explizite group by clause an, statt es mySQL zu überlassen. Ja und Punkt 1. nicht vergessen.
    Gruß, defo

    Comment


    • #3
      Vielen Dank für deine Antwort! Ja, mit den ORs war, weil ich das Statement fürs Forum hier etwas gekürzt habe und die wohl vergessen habe ..

      Ich habe jetzt auch meinen Denkfehler entdeckt: Du hast Recht, er liefert die richtigen Ergebnisse, nur eben mit den Score-Wert score_tags des ersten Tags, d.h. der kann auch 0 sein, auch wenn er bei einem anderen größer ist ..
      Wie bekomme ich in mein Ergebnis den größten Wert von score_tags rein?

      Comment


      • #4
        Hallo,
        Originally posted by defo View Post
        ...Falk hat das schon mal schön beschrieben....
        ...z.B. hier: GROUP BY bei MS SQL

        Originally posted by herlos View Post
        ...Wie bekomme ich in mein Ergebnis den größten Wert von score_tags rein?
        Das steht z.B. hier: Bei "doppelten" Datensätzen nur einen anzeigen

        Edit: Wobei für dein Problem wahrscheinlich ein einfaches MAX() reicht. Dann kannst du auch das Group By so lassen

        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


        • #5
          So, vielen vielen Dank! Jetzt hab ichs!
          Weiß manchmal wirklich nicht, wie ich ohne so engagierte Leute in Foren mit meinem Code vorwärts kommen würde!
          Zuletzt editiert von herlos; 19.04.2012, 18:30.

          Comment

          Working...
          X