Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MYSQL-"Select like"- Vorkommen zählen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] MYSQL-"Select like"- Vorkommen zählen

    Hey,
    ich habe eine Frage und finde die Lösung einfach nicht.
    Ich hoffe sie ist nicht zu niveaulos^^

    Ich habe eine Datenbank mit Texten, aus der ich einen Text auswählen möchte.
    Hierzu die folgende Beispielabfrage:
    "SELECT titel,text,autor FROM texte WHERE beschreibung LIKE '$Suchbegriff'"

    Meine Frage ist nun: Wie zähle ich in dem zurückgegebenen(durchsuchten) Texten, wie oft $Suchbegriff vorkommt? Gibt es eine MYSQL-Query, die mir gleich sagt, wie oft die Abfrage fündig geworden ist?
    $Suchbegriff kann auch mehrere Begriffe darstellen, es muss nicht zwangsläufig nur einer sein.

  • #2
    MYSQL zählt da gar nichts, wenn Du es ihm nicht sagst. Ich schätze aber, in PHP geht das einfacher.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      also gibt es keine mysql function, die mir die anzahl der vorkommenden ($suchbegriff)e gibt?
      mir bleibt also nichts anderes übrig, als mit einer while()-schleife den text auseinander zu nehmen und den inhalt "manuell" zu durchsuchen?

      Kommentar


      • #4
        Zitat von Tobias3339 Beitrag anzeigen
        "SELECT titel,text,autor FROM texte WHERE beschreibung LIKE '$Suchbegriff'"

        Meine Frage ist nun: Wie zähle ich in dem zurückgegebenen(durchsuchten) Texten, wie oft $Suchbegriff vorkommt?
        probiert mal dies und schau Dir den Wert von "anzahl" an.

        Code:
        "SELECT COUNT(*) AS anzahl FROM texte WHERE beschreibung LIKE '$Suchbegriff'"
        Liefert die Anzahl der Treffer.

        Grüße
        Thomas

        Kommentar


        • #5
          Ihm geht es aber anscheinend nicht darum wie viele Einträge gefunden werden sondern wie oft der gesuchte Wert PRO Eintrag gefunden wurde!

          Kommentar


          • #6
            Also nicht nur ob, sondern auch wie oft der '$Suchbegriff' in der Spalte 'beschreibung' vorkommt?

            Fällt mir spontan nichts ein, bis auf eine WHILE- oder LOOP-Schleife in einem Stored Procedure oder in PHP auswerten.

            Eventuell läßt sich in MySQL mit REGEX etwas basteln.

            Grüße
            Thomas

            Kommentar


            • #7
              Richtig, mir geht es darum, wie oft das gesuchte Keyword pro zurückgeliefertem Text vorkommt.

              Hier ein Beispiel:
              PHP-Code:
              $Suchbegriff=array();
              $Suchbegriff[]=zwei;
              $Suchbegriff[]=vier;
              $Suchbegriff[]=sieben;
              $query="SELECT titel,text,autor FROM texte WHERE ";
              $i=0;
              while (
              $i < (count($Suchbegriff)) {
              $query .= "(beschreibung LIKE  $Suchbegriff[$i])";
              if (
              $i < ((count($Suchbegriff) -1)) {
              $query .= " OR ";
              };
              $i++;
              }
              mysql_query($query); 
              Dieser Code gibt mir jetzt folgenes zurück:

              Titel2,Dies ist der Text des zweiten Titels,Tobi
              Titel4,Dies ist der Text des vierten Titels,Nils
              Titel7,Dies ist der Text des siebten Titels,Marvin
              Nun möchte ich, wenn ich das Ergebnisse mit einer while-schleife anzeigen lasse, nicht nur die Rückgabe der Anfrage anzeigen lassen, sondern auch direkt mit anzeigen, wie oft jeweils der Suchbegriff in dem Eintrag gefunden wurde. In diesem Fall wäre die Rückgabe für jeden der 3 Einträge eins.

              Ich hoffe, das dies verständlich genug war.

              Kommentar


              • #8
                Ich bleibe bei meiner Aussage. Du könntest in SQL noch relativ einfach ermitteln, wieviele der genutzten Suchbegriffe in einem Text jeweils vorkommen - also bspw. ID Soundso enthält 'zwei' , 'sieben' also 2 Treffer, aber wie oft jeweils einer vorkommt, wird arg kompliziert.
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar


                • #9
                  Ok und wie würdest du deinen Vorschlag am besten lösen?
                  Kannst du mir ein Code-Beispiel geben?

                  Kommentar


                  • #10
                    [MAN]substr_count[/MAN]
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #11
                      Zitat von Tobias3339 Beitrag anzeigen
                      Richtig, mir geht es darum, wie oft das gesuchte Keyword pro zurückgeliefertem Text vorkommt.
                      Andere Lösung:

                      Um dies mit Bordmitteln der Datenbank zu lösen, sollten die betreffenden Inhalte der Spalten, also "text" und/oder "beschreibung" normalisiert werden, also die einzelnen Worte einzeln abspeichern.

                      Könnte z. B. so aussehen...

                      Code:
                      CREATE TABLE suchwort (
                       id INT NOT NULL,
                       wort varchar(20), -- Z.B. 'vierten'
                       haeufigkeit INT NOT NULL, -- Z.B 1 
                       tabelle_id INT NOT NULL, -- z.B. 1 = Tabelle 'Texte'
                       spalte_id INT NOT NULL  -- z.B. 1 = Spalte 'Text'
                      )
                      Also ähnlich wie ein Suchmaschinenindex. So eine Tabelle zu pflegen ist aber aufwändig. Die PHP-Lösung ist schneller/einfach zu erreichen. Hängt aber letzlich von der Projektkomplexität und der Datenmenge ab.

                      Grüße
                      Thomas

                      Kommentar


                      • #12
                        ok, das heißt also Texte auseinandernehmen, in einzelnen Worten abspeichern und Worte, die in mehreren Texten vorkommen, bekommen mehrere "spalte_id" und "tabelle_id" zugeordnet? Also z.B. tabelle_id = 1/5/17
                        was heißen würde, dass dieses Wort in Text1, Text5 und Text17 vorkommen würde, habe ich das so richtig verstanden?

                        Und zu PHP, was heißt schneller? Wenn ich mir eine PHP function schreibe und sagen wir beispielsweise 30 Texte bearbeiten muss, wäre doch die SQL bezogene Lösung schneller? Zumal ich ja auch alle 30 Textinhalte zur Bearbeitung abrufen müsste, was ich so nicht muss...

                        Kommentar


                        • #13
                          Im Prinzip ja, aber wenn dieser Vorschlag passt, dann müssen die Daten noch weiter normalisiert werden, damit keine redundanten Daten gespeichert werden.

                          also meine erweiterte Tabellenstruktur wäre:

                          Code:
                          CREATE TABLE suchwort (
                           suchwort_id INT NOT NULL,
                           suchwort VARCHAR(50),
                           PRIMARY KEY (suchwort_id)
                          );
                          
                          CREATE TABLE suchwort_quelle (
                           quelle_id INT NOT NULL,
                           suchwort_id INT NOT NULL,
                           haeufigkeit INT NOT NULL,
                           tabelle_id INT NOT NULL,
                           spalte_id INT NOT NULL,
                           PRIMARY KEY (quelle_id),
                           
                           CONSTRAINT fk_suchwort_quelle
                            FOREIGN KEY (suchwort_id)
                             REFERENCES suchwort (suchwort_id)
                           
                          );
                          Mach Dir mal eine kleines Test-Skript um zu prüfen, ob Deine Daten so sinnvoll gespeichert werden können


                          Grüße
                          Thomas

                          Kommentar


                          • #14
                            Ok, klingt sehr überzeugend.
                            Nur eine Sache interessiert mich noch an deinem Vorschlag:

                            CREATE TABLE suchwort_quelle (
                            quelle_id INT NOT NULL,
                            suchwort_id INT NOT NULL,
                            haeufigkeit INT NOT NULL, <<<<<
                            tabelle_id INT NOT NULL,
                            spalte_id INT NOT NULL,
                            PRIMARY KEY (quelle_id),
                            Die Häufigkeit des Suchwortes kann ich ja nicht angeben, wenn sich ein Suchwort, auf mehrere Texte beziehen kann. Sollte ich also besser Suchwörter mehrfach der Table 'suchwort' injizieren?

                            Kommentar


                            • #15
                              Doch, die Häufigkeit zu ermitteln, ist das eigentliche Problem beim Füllen dieser Tabellen.


                              Beispiel

                              Tabelle: kunde (z.B. ID=1)
                              spalte: bemerkung (z.B. ID=7)

                              $bemerkung="Dies ist ein ganz ganz langer Text"

                              Code:
                              suchwort:
                              
                              id| suchwort
                              ---------
                              1 | dies
                              2 | ist
                              3 | ein
                              4 | ganz
                              5 | langer
                              6 | text
                              
                              
                              suchwort_quelle:
                              ----------------
                              quelle_id suchwort_id haeufigkeit tabelle_id spalte_id 
                              ------------------------------------------------------
                              1           1             1            1          7
                              2           2             1            1          7
                              3           3             1            1          7
                              4           4             2            1          7
                              5           5             1            1          7
                              6           6             1            1          7
                              Das Programm diese Tabellen zu füllen ist nicht ganz einfach und die Daten müssen womöglich immer wieder aktualisiert werden. Dass will gut durchdacht sein.

                              Grüße
                              Thomas

                              Kommentar

                              Lädt...
                              X