AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Suchfunktion mit "Gruppierung"
Thema durchsuchen
Ansicht
Themen-Optionen

Suchfunktion mit "Gruppierung"

Ein Thema von Matze · begonnen am 5. Mär 2011 · letzter Beitrag vom 6. Mär 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 07:53
Datenbank: MySQL • Version: 5.x • Zugriff über: PHP
Hi zusammen,

ich habe in einer Tabelle "tab_entries" mehrere Text-Einträge u.a. mit den Spalten "f_hits" (= Anzahl Aufrufe), "f_cat_id" (= zugehörige Kategorie-ID) und "f_status_id" (= ID des Status eines Eintrags wie "erledigt").
In einer weiteren Tabelle "tab_search_index" befindet sich ein Suchindex mit den Spalten "f_word" (= Wort im Text) und "f_entry_id" (= ID des Eintrags, in dem das Wort enthalten ist).

Nun möchte ich nach einem der indizierten Wörter suchen und die zugehörigen Einträge bekommen.
Prinzipiell funktioniert das wie folgt:
SQL-Code:
SELECT e.* FROM tab_entries e
   JOIN tab_search_index i
      ON i.f_entry_id = e.id
   WHERE i.f_word = 'Suchbegriff'
Das nur zum verständlichen Einstieg in die Thematik.
Nun gibt es noch 2 weitere Tabellen "tab_entries_status" (= Status eines Eintrags wie "erledigt", "nicht erledigt") und "tab_categories" (= sämtliche Kategorien, denen Einträge zugeordnet werden können).

Da ich diese Daten auch haben möchte, würde sich die SQL-Abfrage wie folgt erweitern:
SQL-Code:
SELECT e.*, s.f_status_name, c.f_name FROM tab_entries e
   JOIN tab_categories c
      ON c.id = e.f_cat_id
   JOIN tab_search_index i
      ON i.f_entry_id = e.id
   JOIN tab_entries_status s
      ON s.id = e.f_status_id
   WHERE i.f_word = 'Suchbegriff'
Aber das wäre natürlich viel zu einfach so.

Ich hätte gerne die Suchergebnisse gruppiert nach Kategorien und pro Kategorie sollen die 2 am häufigsten aufgerufenen Einträge angezeigt werden. Schön wäre hier eine Lösung über "LIMIT", sodass ich die Anzahl der angezeigten Treffer (hier: 2) leicht verändert kann.
Zusätzlich soll die Anzahl aller Treffer zurückgegeben werden.

Später soll die Ausgabe so aussehen:
Code:
Kategorie 1:
- Treffer mit den häufigsten Aufrufen       erledigt
- Treffer mit den zweithäufigsten Aufrufen  nicht erledigt
Anzahl Treffer in der Kategorie insgesamt: 12

Kategorie 2:
- Treffer mit den häufigsten Aufrufen       erledigt
- Treffer mit den zweithäufigsten Aufrufen  erledigt
Anzahl Treffer in der Kategorie insgesamt: 25

...
Aktuell durchlaufe ich alle Kategorien und führe pro Kategorie zwei SQL-Abfragen aus: Eine ermittelt mir die 2 am häufigsten angeklickten Einträge und die Andere über "COUNT(e.id)" die Anzahl der Treffer.
Beides zusammen in einer Abfrage lieferte bei mir nicht das gewünschte Ergebnis.

Das Ganze soll auch mit mehreren Suchbegriffen funktionieren, also mit ... WHERE i.f_word = 'Suchbegriff1OR i.f_word = 'Suchbegriff2' Von der Performance sollte das auch bei einigen tausend Einträge nicht zu langsam werden.
Ich könnte mir auch vorstellen, eine Abfrage zu haben und das Ergebnis per PHP zu zerlegen, falls das einfacher ist.
Gut wäre auch, wenn die Abfrage leicht auf andere DBMS übertragen werden kann. Also nicht unbedingt MySQL-spezifische Befehle enthält.

Habt ihr hierfür eine Idee/Lösung?

PS: Die Abfragen habe ich hier hinein getippt. Daher könnten diese evtl. Syntaxfehler enthalten.

Grüße
Matze

Geändert von Matze ( 5. Mär 2011 um 09:06 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 09:04
Am Ende ist vom Status aber nichts mehr zu sehen, weder als Anzeige noch Einschränkung oder ist der bloße Join die Einschränkung?
Hast Du richtige Tabellendefinition?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 09:05
Hallo,

doch, den Status lasse ich mit anzeigen. Nur in dem kleinen Auszug habe ich den weg gelassen. Ich ergänze ihn kurz.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 10:28
also allgemein ist es nicht, da die genutzte Funktion oracle spezifisch ist und ich nicht weiß, wie weit das einem ANSI Standard folgt.
SQL-Code:
select o.*, s.*
      from (select id,
                   f_hits,
                   f_cat_id,
                   f_word,
                   f_status_id,
                   row_number() over(partition by f_cat_id order by f_hits) as TopOf
              from (SELECT e.id, e.f_hits, e.f_cat_id, f_word, e.f_status_id
                      FROM tab_entries e
                      JOIN tab_search_index i
                        ON i.f_entry_id = e.id
                     WHERE i.f_word = 'Stadt--'Fluss'
                    ) i) o,
           tab_entries_status s
     where o.TopOf < 3
       and s.id = o.f_status_id
     order by o.f_cat_id, o.f_hits desc
Die Einschränkung (Suchwort) habe ich extra "innen" gemacht, was am schnellsten sein dürfte. Ist trotzdem aber mitgeschleift, wäre also view tauglich, die Einschränkung müsste dann aber außen erfolgen.
Restliche Felder kann man m.E. nach belieben außen weglassen oder anfügen /joinen.

Edit: Ich hab vergessen, dass mehrere Suchworte möglich sein sollen.
Wenn ID bzw. SuchwortFeld mitgeschleift werden, ist das natürlich möglich. Geht es um mehrere tausend Einträge, wäre wie gesagt die innere Einschränkung vorteilhaft. Das ginge nur über eine Prozedur/Funktion, wo zunächst das Suchwort gesetzt wird und in der Where Bedinungung dann abgefragt wird.
Gruß, Jo

Geändert von mkinzler ( 5. Mär 2011 um 10:54 Uhr) Grund: CODE-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 18:55
Hallo,

vielen Dank.
Leider habe ich es noch nicht hinbekommen, das unter MySQL zum Laufen zu bekommen. Gibt es hier MySQL-Gurus, die das übersetzen können?
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 19:02
Hallo,

vielen Dank.
Leider habe ich es noch nicht hinbekommen, das unter MySQL zum Laufen zu bekommen. Gibt es hier MySQL-Gurus, die das übersetzen können?
Over und PartitionBy ist schwierig. Diese ganzen OLAP-Erweiterungen (auch sowas wie CUBE) werden von MySQL quasi gar nicht unterstützt.
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 19:06
Hm, wie könnte ich das dann lösen?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 20:55
Hier sind meine Daten /Ergebnisse. Vielleicht ist es nicht was Du haben wolltest, dann brauchst Du das SQL ja so auch nicht


Code:
SELECT e.id, e.f_hits, e.f_cat_id, f_word, e.f_status_id
  FROM tab_entries e
  JOIN tab_search_index i
    ON i.f_entry_id = e.id
Ergebnis
Code:
ID   F_HITS   F_CAT_ID   F_WORD   F_STATUS_ID
1   20   1   Stadt   1
2   22   3   LAnd   1
1   5   2   Stadt   2
2   9   3   LAnd   2
1   11   3   Stadt   2
1   33   4   Stadt   2
1   12   4   Stadt   1
1   13   4   Stadt   2
1   9   3   Stadt   2
1   12   1   Stadt   1
1   13   1   Stadt   2

Code:
      select o.*, s.*
        from (select id,
                     f_hits,
                     f_cat_id,
                     f_word,
                     f_status_id,
                     row_number() over(partition by f_cat_id order by f_hits) as TopOf
                from (SELECT e.id, e.f_hits, e.f_cat_id, f_word, e.f_status_id
                        FROM tab_entries e
                        JOIN tab_search_index i
                          ON i.f_entry_id = e.id
                       WHERE i.f_word = 'Stadt' --'Fluss'
                      ) i) o,
             tab_entries_status s
       where o.TopOf < 3
         and s.id = o.f_status_id
       order by o.f_cat_id, o.f_hits desc
Code:
ID   F_HITS   F_CAT_ID   F_WORD   F_STATUS_ID   TOPOF   ID   F_STATUS_NAME
1   13   1   Stadt   2   2   2   unfertich
1   12   1   Stadt   1   1   1   fertich
1   5   2   Stadt   2   1   2   unfertich
1   11   3   Stadt   2   2   2   unfertich
1   9   3   Stadt   2   1   2   unfertich
1   13   4   Stadt   2   2   2   unfertich
1   12   4   Stadt   1   1   1   fertich

Für MySQL gibts aber doch einige Seiten zum Thema,
Analytic Functions nachbilden. Das Suchwort wäre also "Analytic Functions mySQL"

Die Formatierung sieht doof aus, keine Ahnung ob das besser geht. Als Screenshot ist es besser lesbar, aber so als Text kann man die Zahlen noch weiter nutzen.
Gruß, Jo
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 21:10
Hm, wie könnte ich das dann lösen?
Du gruppierst nachträglich - zum Beispiel über ein Dictionary - in deinem Anwendungscode. (Auch wenn das bei dir wohl *brrr* PHP sein wird)
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Suchfunktion mit "Gruppierung"

  Alt 5. Mär 2011, 23:41
Hm, wie könnte ich das dann lösen?
Du gruppierst nachträglich - zum Beispiel über ein Dictionary - in deinem Anwendungscode. (Auch wenn das bei dir wohl *brrr* PHP sein wird)
Wozu das denn? Geht doch alles mit SQL

Code:
Select
  a
From (
Select
  foo As a
From
  TabA
Union
Select
  foo
From
  TabB ) As TempQry
Group By
  a
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz