Announcement

Collapse
No announcement yet.

Werte plus literare in anderem Feld vorhanden ?

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

  • Werte plus literare in anderem Feld vorhanden ?

    Hallo!

    Ich wieder mal Ich möchte gerne Wissen ob mein Vorhaben in MySQL umsetzbar ist...

    Folgende Tabellen:

    Code:
    tab_wetten
    ID | Wette        | Antworten         | KorrAntwort |
    -----------------------------------------------------
    12 | Wer gewinnt? | Hans;Franz;Robert |             |
    
    
    tab_tipps
    ID | Nickname | WettID | Tipp   |
    ---------------------------------
    87 | Supaman  | 12     | Franz  |
    88 | TheBest  | 12     | Robert |

    Ich würde da nun mal einen JOIN auf die beiden Tabellen machen

    Code:
    ID | Wette        | Antworten         | KorrAntwort | TippID | Nickname | WettID | Tipp   |
    12 | Wer gewinnt? | Hans;Franz;Robert |             |    87  | Supaman  | 12     | Franz  |
    12 | Wer gewinnt? | Hans;Franz;Robert |             |    88  | TheBest  | 12     | Robert |
    und würde dann gerne Abfragen, ob ";Tipp" OR ";Tipp;" OR "Tipp;" nicht in den Antworten vorkommt.

    Als Beispiel ob ";Franz" oder ";Franz;" oder "Franz;" bei der jeweiligen Wette auch in Antworten vorkommt.. meinetwegen dann noch mit dem trim, aber das ist jetzt mal egal...

    Soll ein Check der Datenintegrität sein und möchte mir gerne die PHP-Schleife sparen, wenn möglich. (Es kann ja vorkommen das der Admin einen Tippfehler draufkommt und dann die Antowrtmöglichkeit ändert, aber ein User schon getippt hat und dann findet sich das nicht mehr zusammen da die Antwort (der einfachheit halber) als Text gespeichert wird.)

    // EDIT:
    So??
    PHP Code:
    SELECT ...
      
    INNER JOIN ....
    WHERE ((CONCAT(';',Tipp) OR CONCAT(Tipp,';') OR CONCAT(';',Tipp,';')) NOT IN Antworten
    Danke!
    Juergen
    Zuletzt editiert von hausl78; 28.10.2010, 15:54.

  • #2
    Find_in_Set ist genau das was du suchst:
    http://dev.mysql.com/doc/refman/5.1-...on_find-in-set

    //edit: Mir fällt gerade ein, das dies nur bei Komma getrennten Werten funktioniert. Also würde ich ganz einfach eine Volltextsuche verwenden mit MATCH()
    Zuletzt editiert von Steusi; 28.10.2010, 18:12.
    SQL-Code bitte korrekt formatieren

    Gruß Steusi

    Comment


    • #3
      Hallo!

      Du meinst jetzt vereinfacht so:

      Ich hab einen Datensatz wie folgt:

      Code:
      ID  |  Spalte1  |  Spalte2 
      1   |  AB       |  CD;AB;DE
      etc..
      dann könnte ich so abfragen:

      Code:
      SELECT * FROM MyTab 
      WHERE NOT MATCH (Spalte2)
        AGAINST (
          CONCAT(';',Spalte1)
          OR CONCAT(Spalte1,';')
          OR CONCAT(';',Spalte1,';')
        )

      Comment


      • #4
        Nein, dies ist doch etwas umständlich. Da es ja nur eine Spalte ist genügt LOCATE oder INSTR aus, in etwa so:

        Code:
        SELECT 
        w.Wette,
        t.Nickname,
        t.Tipp
        FROM tab_wetten AS w
        INNER JOIN
        tab_tipps AS t
        ON w.ID = t.WettID
        WHERE LOCATE(t.Tipp,w.Antworten)=0;
        Damit ermittelst du alle Benutzer, die einen Tipp abgegeben haben, welcher nicht vorkommt. Das ist doch dein Ziel, wenn ich dich richtig verstehe. Auch wenn mir nicht ganz klar wird warum?

        Ich würde dem User in einer Selectbar nur die möglichen Antworten zur Auswahl geben.

        PS: gibt es keine [SQL] [/SQL] Statements?
        SQL-Code bitte korrekt formatieren

        Gruß Steusi

        Comment


        • #5
          Ja, du hast mich voll durchschaut, stimmt alles...

          Also:

          1. Der User bekommt nur ein DropDown zum Auswählen

          2. Das Problem könnte der Admin sein... Der Pflegt die Fragen in phpMyAdmin und angenommen der findet in einer Antwortmöglichkeit einen Tippfehler und korrigiert den ABER ein User hat schon getippt... dann findet die Antwort nichtmehr zur Antwortmöglichkeit - und genau solche möchte ich abfragen können, quasi als reine "Konsistenzprüfung"..

          3. Das mit dem Strichpunkt war für mich eine Sicherheit, damit es nur dann herausfällt wenn es wirklich das nicht gibt weil ja blödes Beispiel "Ja" auch in "Jahr" vorkommt und wenn jetzt Ja;Jahr; etc.. dann wäre das ein Fehlalarm deshalb der Quack mir dem Strichpunkten...

          Comment


          • #6
            Achso, natürlich. Dann prüfe, ob das Wort wirklich um ; umschlossen wird. Du kannst natürlich wie oben schon alle 3 Fälle einzeln abfragen, oder du erweiterst die Antwortmöglichkeiten einfach um ein führendes und schließendes ;

            Damit ergibt sich folgende Abfrage:
            Code:
            SELECT 
            w.Wette,
            t.Nickname,
            t.Tipp
            FROM tab_wetten AS w
            INNER JOIN
            tab_tipps AS t
            ON w.ID = t.WettID
            WHERE LOCATE(
            CONCAT(';',t.Tipp,';'),
            CONCAT(';',w.Antworten,';')
            )=0
            Ich würde aus Konsistenzgründen eine Formular zum ändern von Rechtschreibfehlern entwerfen, welchen ein Update in beiden Tabellen durchführt, dann ist es für den Admin zum einen einfacher, da er nicht extra bei phpMyAdmin rein muss und du hast keine Dateninkonsistenz :-)
            SQL-Code bitte korrekt formatieren

            Gruß Steusi

            Comment


            • #7
              So, versucht und schein prima zu funktionieren, vielen Dank!!

              PHP Code:
              SELECT z.Wettez.antwMoeglt.Tipp
              FROM tab_zw 
              AS z
              INNER JOIN tab_zw_tipps 
              AS t
              ON z
              .zwID t.zwIDRef
              WHERE
                  LOCATE
              (CONCAT(';',t.Tipp), z.antwMoegl)=0
              AND 
                  
              LOCATE(CONCAT(t.Tipp,';'), z.antwMoegl)=0
              AND
                  
              LOCATE(CONCAT(';',t.Tipp,';'), z.antwMoegl)=
              ergibt

              Code:
              +--------------------------------------+---------------------------------------------------------------------+---------------+
              | Wette                                | antwMoegl                                                           | Tipp          |
              +--------------------------------------+---------------------------------------------------------------------+---------------+
              | Wer belegt in Gruppe A den 1. Platz? | SV Werder Bremen;Tottenham Hotspur;FC Twente Enschede;Inter Mailand | Inter Meiland |
              +--------------------------------------+---------------------------------------------------------------------+---------------+
              Zuletzt editiert von hausl78; 28.10.2010, 20:50.

              Comment


              • #8
                Wie gesagt, das ergibt das Gleiche. Beim stöbern hier im Forum ist mir eine gute Codezeile über den Weg gelaufen, an die ich gar nicht so schnell gedacht habe.

                In deinem Fall so:
                Code:
                FIND_IN_SET(t.Tipp, REPLACE(z.antwMoegl, ';', ',')
                Was im gesamten (ich verwende mal meine Bezeichnungen ) so aussieht:
                [highlight=sql]
                SELECT
                w.Wette,
                t.Nickname,
                t.Tipp
                FROM tab_wetten AS w
                INNER JOIN
                tab_tipps AS t
                ON w.ID = t.WettID
                WHERE FIND_IN_SET(t.Tipp, REPLACE(w.Antworten, ';', ','))=0
                [/highlight]

                Finde ich etwas eleganter, oder was meinst du?
                Zuletzt editiert von Steusi; 28.10.2010, 22:28.
                SQL-Code bitte korrekt formatieren

                Gruß Steusi

                Comment


                • #9
                  - Findet das selbe Ergebnis
                  - Sieht eleganter aus
                  ABER
                  - Hat das mit den Begrenzern eigentlich nicht drinnen

                  Ganz blödes Beispiel:

                  Die Antworten auf eine Frage wären: Ja;Nein;nächstes Jahr;nie wieder

                  und der User tippt "Ja".. so dann kommt der Admin drauf und passt nicht auf das ergentlich Jo schreiben will und bessert Ja -> Jo... dann findet das die elegantere Variante nicht, weil Ja vorkommt nämlich in Jahr, oder?

                  Ich versuchs eben mal...

                  Comment


                  • #10
                    Doch.. padauz das geht.. dann nehm ich das, danke! Die folgenden 4 findet er inklusive dem Ja, das eigentlich in Jahr vorhanden wäre.. super!

                    Code:
                    | zwID | Runde                   | Wette                                | antwMoegl    | zwTippID | Tipp          |
                    -------------------------------------------------------------------------------------------------------------------
                    | 5007 | 2) Gruppenplatzierungen | Wer belegt in Gruppe A den 1. Platz? | Jo;Nein;Jahr | 62       | Ja            |
                    | 5007 | 2) Gruppenplatzierungen | Wer belegt in Gruppe A den 1. Platz? | Jo;Nein;Jahr | 78       | Inter Mailand |
                    | 5007 | 2) Gruppenplatzierungen | Wer belegt in Gruppe A den 1. Platz? | Jo;Nein;Jahr | 94       | Inter Mailand |
                    | 5007 | 2) Gruppenplatzierungen | Wer belegt in Gruppe A den 1. Platz? | Jo;Nein;Jahr | 110      | Inter Mailand |
                    | 5007 | 2) Gruppenplatzierungen | Wer belegt in Gruppe A den 1. Platz? | Jo;Nein;Jahr | 136      | Inter Mailand |

                    Comment


                    • #11
                      Doch, dann findet die "elegante" Variante es selbstverständlich. Das ist ja das schöne an der Funktion.
                      SQL-Code bitte korrekt formatieren

                      Gruß Steusi

                      Comment


                      • #12
                        Schon eingebaut ;-) Super Forum hier echt..

                        Danke nochmals...

                        Jürgen

                        Comment


                        • #13
                          Falls es jemanden interessiert

                          Mittlerweile prüf ich das hier schon alles kreuz und quer (um Datenleichen auszuschliessen) beim Admin-Login:



                          Danke nochmals!
                          Jürgen

                          Comment

                          Working...
                          X