matching?

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

  • matching?

    Hallo,

    ich habe eine tabelle(freizeit) in der 10 verschiedene freizeitaktivitäten (Werte 0 oder 1) + userid stehen:

    id, laufen, tennis, angeln, skaten, basketball, fussball, lesen, wandern, radfahren, schwimmen

    ich habe einen user mit "SELECT * FROM freizeit where id = $id LIMIT 0,1"
    rausgesucht und möchte jetzt herrausfinden, wer genau die gleichen oder FAST genau die gleichen werte hat. Mit genau den gleichen ist ja einfach, aber wie finde ich die raus, die mit Ausnahme von 1,2 oder gar 3 Werten (mehr, weniger oder komplett andere Werte), dennoch auf den zuerst rausgesuchten datensatz 'matchen'...?

    Kann mir da jmd helfen?
    Ist die derzeitige DB-Struktur dafür überhaupt geeignet?

  • #2
    Ist die derzeitige DB-Struktur dafür überhaupt geeignet?
    ich sach einfach mal nein!

    denn die db struktur, welche du im moment hast, ist eh für'n a****.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      und wie würdest Du das strukturieren, um solch ein matching zu realisieren?

      Kommentar


      • #4
        m:n
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Original geschrieben von Abraxax
          m:n
          *??

          Kommentar


          • #6
            http://www.google.de/search?hl=de&q=...nG=Suche&meta=
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Also wenn ich http://de.wikipedia.org/wiki/Normalisierung_(Datenbank) richtig verstanden habe, soll meine Tabelle nur aus den spalten

              userID und aktivitaet

              bestehen und die werte von aktivitaet bestehen beispielsweise aus zahlen (in meinem Fall von 1-10), die wiederum für eine Aktivität stehen. Bei !isset($aktivitaet) wird kein Eintrag gemacht.

              Und wie realisiere ich hier ein Matching?

              Kommentar


              • #8
                das wäre dann das nächste, wenn du das erste umgesetzt hast.

                und ... vielleicht kommst du dann auch noch selber drauf. ;-)
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  Re: matching?

                  Anderer Ansatz:

                  freizeit(id:int, hobbies:varchar(255))
                  ---------------------------------------------
                  1, laufen tennis angeln skaten basketball fussball lesen
                  2, basketball fussball lesen wandern radfahren
                  3, schwimmen reiten radfahren

                  ... mit Fulltext Index auf der Spalte hobbies. Falls VARCHAR zu klein sein sollte, ginge auch TEXT.

                  Hobbies des Users mit $id:
                  SELECT hobbies FROM freizeit WHERE id = $id

                  Wer paßt zu diesem User?
                  SELECT id, hobbies FROM freizeit WHERE MATCH(hobbies) AGAINST('$hobbies')

                  Einwände?

                  Kommentar


                  • #10
                    > Einwände?

                    Wird dadurch die DB nicht unnötig groß?

                    das würde doch auch funktionieren, wenn man zahlen (die eben für die entsprechende Aktivität stehen) nimmt, um so den nachteil der größe wegzunehmen, oder?

                    Nochmal zum grundsätzlichem Verständnis;

                    Soll ein datensatz alle aktivitäten beinhalten, also so ausschauen:

                    userID, aktivitaet
                    1, '1 2'
                    2, '7 8'
                    3, '1 2 7 8'

                    oder so:

                    id, userID, aktivitaet
                    1, 1, 1
                    2, 1, 2
                    3, 2, 7
                    4, 2, 8
                    5, 3, 1
                    6, 3, 2
                    7, 3, 7
                    8, 3, 8

                    oder gar nur so:

                    userID, aktivitaet
                    1, 1
                    1, 2
                    2, 7
                    2, 8
                    3, 1
                    3, 2
                    3, 7
                    3, 8

                    Vielleicht ist zu erwähnen, dass mindestens 4 und maximal 8 Aktivitäten gesetzt werden, und das zu jedem user(der ansonsten auch schon einen table mit passwort- und kontaktdaten hat).
                    Zuletzt geändert von westberlin; 10.10.2005, 01:33.

                    Kommentar


                    • #11
                      Mit der Query:

                      SELECT userID, MATCH (`aktivitaet`) AGAINST ('1 2') AS score FROM test1 WHERE MATCH (`aktivitaet`) AGAINST ('1 2')

                      auf folgende tabelle

                      CREATE TABLE `test1` (
                      `userID` mediumint(8) NOT NULL default '0',
                      `aktivitaet` varchar(25) collate latin1_general_ci NOT NULL default '',
                      PRIMARY KEY (`userID`),
                      FULLTEXT KEY `aktivitaet` (`aktivitaet`)
                      ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

                      INSERT INTO `test1` VALUES (1, '1 2');
                      INSERT INTO `test1` VALUES (2, '7 8');
                      INSERT INTO `test1` VALUES (3, '1 2 7 8');

                      Erhalte ich kein Ergebnis, obwohl ich userID 1 und 3 erwarten würde...

                      Auch mit

                      SELECT userID, MATCH (`aktivitaet`) AGAINST ('1 2' IN BOOLEAN MODE) AS score FROM test2 WHERE MATCH (`aktivitaet`) AGAINST ('1 2' IN BOOLEAN MODE) GROUP BY userID

                      auf

                      CREATE TABLE `test2` (
                      `id` mediumint(8) NOT NULL default '0',
                      `userID` mediumint(8) NOT NULL default '0',
                      `aktivitaet` char(2) collate latin1_general_ci NOT NULL default ''
                      ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

                      INSERT INTO `test2` VALUES (1, 1, '1');
                      INSERT INTO `test2` VALUES (2, 1, '2');
                      INSERT INTO `test2` VALUES (3, 2, '7');
                      INSERT INTO `test2` VALUES (4, 2, '8');
                      INSERT INTO `test2` VALUES (5, 3, '1');
                      INSERT INTO `test2` VALUES (6, 3, '2');
                      INSERT INTO `test2` VALUES (7, 3, '7');
                      INSERT INTO `test2` VALUES (8, 3, '8');

                      erhalte ich kein ergebnis...?



                      Zuletzt geändert von westberlin; 10.10.2005, 02:08.

                      Kommentar


                      • #12
                        @Abraxax

                        kannst Du da nochmal n Blick drauf werfen, warum die Abfrage kein Ergebnis liefert?! Ich finde es nicht heraus...

                        Kommentar


                        • #13
                          http://dev.mysql.com/doc/mysql/en/fulltext-search.html tut kund:
                          The MySQL FULLTEXT implementation regards any sequence of true word characters (letters, digits, and underscores) as a word
                          [...]
                          Any word that is too short is ignored. The default minimum length of words that are found by full-text searches is four characters
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            Das bedeutet, dass onemorenerd's Lösung doch in Frage kommt
                            und dass man eine große DB in kauf nehmen muss, wenn man ein matching realisieren möchte?!

                            onemorenerd's Ansatz:

                            freizeit(id:int, hobbies:varchar(255))
                            ---------------------------------------------
                            1, laufen tennis angeln skaten basketball fussball lesen
                            2, basketball fussball lesen wandern radfahren
                            3, schwimmen reiten radfahren

                            Kommentar


                            • #15
                              Und warum nicht mit der von dir bereits erwähnten Zwischentabelle (je user_id und aktivität_id ein Datensatz) und demZählen der Einträge dort?
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X