Ankündigung

Einklappen
Keine Ankündigung bisher.

Mysql-Abrage - Ausdrücke kombinieren

Einklappen

Neue Werbung 2019

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

  • Mysql-Abrage - Ausdrücke kombinieren

    Hallo zusammen!

    Ich mache in php eine Datenbankabfrage.
    Der Query sieht so aus:
    Code:
    SELECT t.IDENT, t.FAMNAME, t.VORNAME, t. TITEL2, t.NAME2A, t.GEB_DATUM, t.EMAIL, u.ORT, u.TELEFON_01 FROM vkstamm t LEFT JOIN vkadres u ON u.HAUSHALT = t.HAUSHALT WHERE t.FAMNAME > 'Müller Martin ' ORDER BY t.FAMNAME, t.VORNAME, t. TITEL2 LIMIT 0,1;
    --> es soll nun der Datensatz angezeigt werden, der (aplhabetisch geordnet) auf den Namen "Müller Martin" folgt.
    --> der nächste Datensatz wäre demnach "Müller Walter"
    --> Es wird aber der Datensatz "Neumair Lukas" angezeigt, da gleiche Nachnamen ignoriert werden

    FRAGE:
    Wie kann den Query jetzt so ändern, dass auch nach Vornamen gesucht wird (wenn der Nachname öfter als 1x vorkommt) ?
    --> WHERE t.FAMNAME && t.VORNAME > 'Müller Martin ' geht nicht...
    --> Wie kann ich die beiden Ausdücke kombinieren?

    Vielen Dank im Vorraus für jede Antwort!

  • #2
    Dann müsstest du die WHERE-Klausel so schreiben:
    Code:
    WHERE
        t.FAMNAME > 'Müller' OR
        t.FAMNAME = 'Müller' AND
        t.VORNAME > 'Martin'
    Das sollte funktionieren.

    Kommentar


    • #3
      die ergibt keinen Sinn:

      (x OR x) AND y
      =>
      (x) AND y
      =>
      x AND y

      oder meintest du

      x OR (x AND y)
      =>
      x

      Kommentar


      • #4
        Danke für die Antwort!

        Das funktioniert prima ! ! !

        Ein Problem hab ich da aber noch:
        Das ganze soll auch umgekehrt funktionieren, also den vorherigen Datensatz anzeigen können.

        Also hab ich einfach die >-Zeichen durch <-Zeichen ersetzt:
        Code:
        SELECT t.IDENT, t.FAMNAME, t.VORNAME, t.TITEL2, t.NAME2A, t.GEB_DATUM, t.EMAIL, u.ORT, u.TELEFON_01 FROM vkstamm t LEFT JOIN vkadres u ON u.HAUSHALT = t.HAUSHALT WHERE t.FAMNAME < 'Müller' OR t.FAMNAME = 'Müller' AND t.VORNAME < 'Martin' OR t.FAMNAME = 'Müller' AND t.VORNAME = 'Martin' AND t. TITEL2 < '' ORDER BY t.FAMNAME, t.VORNAME, t. TITEL2 LIMIT 1
        Leider funktioniert das aber nicht...

        Weiß jemand warum?

        Kommentar


        • #5
          Wie kann etwas kleiner sein als ein Leer-String?

          Kommentar


          • #6
            Du unterscheidest zwar in t.famname und t.vorname (siehe bei "order by"), aber stellst als Auswahlkriterium unter t.famname den gesamten Namen zur Verfügung.
            Richtig wäre es aber so:
            1. getrennte Übergabe der Parameter "Müller" und "Martin" an den SELECT
            2. Ermitteln, welche DS diese beiden Bedingungen erfüllen (es kann ja sein, dass mehrere "Martin Müller" heissen, oder?)
            3. Als Bedingung für den DS, der alphabetisch nach "Müller Martin" kommt gilt:
            WHERE (t.famname == 'Müller' AND t.vorname > 'Martin') OR (t.famname != 'Müller' AND t.vorname != 'Martin')
            4. Weiter dann mit "ORDER BY"

            Kommentar


            • #7
              t.VORNAME < 'Martin' nicht t.VORNAME = 'Martin'

              Kommentar


              • #8
                Danke für die Antworten!

                @Zergling: ???

                @Gabriel:
                1. die Parameter übergebe ich ja getrennt, (sind 2 Variablen mit verschiedenen Werten, ich hab nur den übersetzten Query gepostet, damit man die Variablen mal bei der Problemlösung weglassen kann)
                2. stimmt, es kann auch vorkommen, dass es zwei "Martin Müller" gibt (daran hab ich noch gar nicht gedacht )
                3. diese Anweisung funktioniert aber nicht...
                die die ich oben gepostet hab sehr wohl, nur halt nicht für den vorherigen Datensatz

                @xabbuh: warum das?!? das kommt ja nur vor, wenn Vor- und Nachname gleich sind (dann wird überprüft ob sie einen Titel haben), und dann muss es ja t.VORNAME = 'Martin' heißen

                @alle: wenn man auf Vorschau klickt um den post anzusehen, werden alle Sonderzeichen (ä,ö,ü,ß) durch Fragezeichen ersetzt, sollte vielleicht mal geändert werden.

                Kommentar


                • #9
                  Zitat von seeker
                  @xabbuh: warum das?!? das kommt ja nur vor, wenn Vor- und Nachname gleich sind (dann wird überprüft ob sie einen Titel haben), und dann muss es ja t.VORNAME = 'Martin' heißen
                  Achso, ich dachte es ging dir jetzt grundsätzlich erst einmal nur darum, wie du den nächst kleineren Datensatz ermitteln kannst.
                  Allerdings ist dann Zerglings Einwand berechtigt, was denn ein Vergleich t.TITEL2 < '' darstellen soll.

                  Kommentar


                  • #10
                    Ich hab es auch so probiert:
                    Code:
                    SELECT t.IDENT, t.FAMNAME, t.VORNAME, t.TITEL2, t.NAME2A, t.GEB_DATUM, t.EMAIL, u.ORT, u.TELEFON_01 FROM vkstamm t LEFT JOIN vkadres u ON u.HAUSHALT = t.HAUSHALT WHERE t.FAMNAME < 'Müller'  ORDER BY t.FAMNAME, t.VORNAME, t. TITEL2 LIMIT 1
                    --> auch so wird nicht der vorherige Datensatz angezeigt

                    t.TITEL2 ist '' weil der Datensatz von "Müller Martin" keinen Titel hat.
                    wenn er zB Dr. wäre dann würde t.TITEL2 = 'Dr.' dort stehen.
                    --> gibt es da ein Problem, wenn ein Datensatz keinen Titel hat?

                    Kommentar


                    • #11
                      Zitat von seeker
                      Danke für die Antworten!
                      @Gabriel:
                      3. diese Anweisung funktioniert aber nicht...
                      die die ich oben gepostet hab sehr wohl, nur halt nicht für den vorherigen Datensatz
                      kann ja auch nicht funktionieren: nicht "==" sondern "=" und nicht "!=" sonder <> usw. . . .
                      habe da wohl etwas vermischt....

                      sorry

                      Kommentar


                      • #12
                        Zitat von Gabriel
                        nicht "==" sondern "="
                        ja böser Fehler ... in SQL ist das n Vergleich während das in PHP ne Zusweisung ist
                        Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                        Kommentar


                        • #13
                          Zitat von Gabriel
                          kann ja auch nicht funktionieren: nicht "==" sondern "=" und nicht "!=" sonder <> usw. . . .
                          Ob man != oder <> verwendet, ist MySQL egal.

                          Kommentar


                          • #14
                            Ich hab den Query jetzt so abgeändert:
                            Code:
                            SELECT t.IDENT, t.FAMNAME, t.VORNAME, t.TITEL2, t.NAME2A, t.GEB_DATUM, t.EMAIL, u.ORT, u.TELEFON_01 FROM vkstamm t LEFT JOIN vkadres u ON u.HAUSHALT = t.HAUSHALT WHERE (t.FAMNAME = 'Müller' AND t.VORNAME = 'Martin' AND t. TITEL2 > '') OR (t.FAMNAME = 'Müller' AND t.VORNAME > 'Martin') OR (t.FAMNAME > 'Müller') ORDER BY t.FAMNAME, t.VORNAME, t. TITEL2 ASC LIMIT 1
                            --> funktioniert genauso gut wie vorher, allerdings sieht's jetzt sauberer aus :wink:

                            2 Probleme gibt es dabei aber noch:
                            1. Was tun, wenn der Name wirklich 2x vorkommt (zB "Müller Martin") ?
                            2. Warum funktioniert die umgekehrte Variante nicht?
                            Code:
                            SELECT t.IDENT, t.FAMNAME, t.VORNAME, t.TITEL2, t.NAME2A, t.GEB_DATUM, t.EMAIL, u.ORT, u.TELEFON_01 FROM vkstamm t LEFT JOIN vkadres u ON u.HAUSHALT = t.HAUSHALT WHERE (t.FAMNAME = 'Müller' AND t.VORNAME = 'Martin' AND t. TITEL2 < '') OR (t.FAMNAME = 'Müller' AND t.VORNAME < 'Martin') OR (t.FAMNAME < 'Müller') ORDER BY t.FAMNAME, t.VORNAME, t. TITEL2 DESC LIMIT 1
                            --> hab es mit DESC und ASC probiert, und mit < und >, aber nie kommt dabei der VORHERIGE Datensatz raus...

                            Scheinbar steh ich total auf der Leitung, kann mich bitte jemand "erleuchten" ?

                            Kommentar


                            • #15
                              ... Sorry, das DESC gehört ja 3x hin....
                              Code:
                              SELECT t.IDENT, t.FAMNAME, t.VORNAME, t.TITEL2, t.NAME2A, t.GEB_DATUM, t.EMAIL, u.ORT, u.TELEFON_01 FROM vkstamm t LEFT JOIN vkadres u ON u.HAUSHALT = t.HAUSHALT WHERE (t.FAMNAME = 'Müller' AND t.VORNAME = 'Martin' AND t. TITEL2 < '') OR (t.FAMNAME = 'Müller' AND t.VORNAME < 'Martin') OR (t.FAMNAME < 'Müller') ORDER BY t.FAMNAME DESC, t.VORNAME DESC, t. TITEL2 DESC LIMIT 1
                              --> nun kann ich auch den vorherigen Datensatz anzeigen!

                              Der oben angesprochene Schönheitsfehler bleibt allerdings noch...
                              Was tun wenn ein Name 2x vorkommt? (zb "Müller Martin")

                              Kommentar

                              Lädt...
                              X