Where Argumente bei JOIN

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

  • Where Argumente bei JOIN

    Hallo ich hab da mal ne Frage


    Ich muß leider zwei Tabellen "joinen", was mittlerweile auch gut funktioniert, nur jetzt will ich das alles auch noch filtern.

    Mein Join Befehel:

    "SELECT user.userid, user.username, user.points, user.onlinetime, user.lastaction, user.sessionid AS sessionid, user.userpage AS userpage,
    user.birthday, additional.value AS gender
    FROM ".$db_tblpre."user user
    LEFT OUTER JOIN ".$db_tblpre."profile_field_value additional
    ON additional.userid = user.userid AND additional.feldid=2 ".
    $where." ORDER BY ".$sortby." ".$order." LIMIT ".$elm_pp*($page-1).",".$elm_pp


    Nun schreibe ich in die Variable $where folgendes rein:

    "WHERE gender LIKE '0' "

    Leider kennt nun SQL "gender" nicht. Warum nicht? Ich dachte das hab ich mit "additional.value AS gender" klar gemacht
    Wie kann ich das sonst machen?


    Hab gleich noch ne Frage dazu:
    Ich will auch gleich nach Geburtstagen filtern lassen. Das mache ich mit:
    ...WHERE birthday <= 1990-01-01 .... z.b.
    Dabei kommt aber nie das richtige raus. Geht das mit Datumsangaben anders? In der DB stehen die Daten auch in der Form von YYYY-MM-DD drinen.
    Zuletzt geändert von Zumlin; 23.02.2007, 17:11.

  • #2
    additional.value benutzen?

    Übrigens: Benutze anstelle von LIKE lieber das Gleichheitszeichen =

    Ist die 0 in der DB ein String oder ein Integer? Wenn Integer, dann weg mit den Anführungszeichen! (0 statt '0')
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      OK = ist wohl besser als LIKE
      Und ist auch ein Integer. Hab die ' schon weggemacht.

      Thx


      Aber mein Hauptproblem hab ich noch nicht im griff.
      Soll ich nach "ON" noch z.b. "AND gender = 0" einfügen. Das wär glaub ich einfacher.
      Ginge es denn überhaupt mit WHERE?
      Und das mit dem Datum hab ich auch noch nicht gelöst

      Kommentar


      • #4
        Welchen Datentyp hat denn die Spalte mit dem Geburtstag?
        Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
        var_dump(), print_r(), debug_backtrace und echo.
        Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
        Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
        Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

        Kommentar


        • #5
          birthday <= 1990-01-01
          bedeutet
          brithday<=1988

          und du brauchst
          birthday <= '1990-01-01'

          und wegen deinen "where"
          bei einem left-join wird "where" deine erste tabelle, die du eigentlich komplet sehen willst auf die in "where" passende datensätze reduziert.
          Also muss du deine bedingung von "where" in "ON" verschieben.
          Zuletzt geändert von Slava; 25.02.2007, 11:30.
          Slava
          bituniverse.com

          Kommentar


          • #6
            Ah danke. Zweiteres hab ich mir schon so gedacht. Das funktioniert leider nur bedingt.
            z.B. füge ich dem "ON"-Teil "AND additional.value = 0"
            Damit werden mir keine Values mehr hinzugefügt die nicht gleich 0 sind. Leider wird danach meine Tabelle nicht reduziert. Also stehen noch alle Zeilen drin. Wie kann ich nun diese Tabelle noch in der WHERE klausel reduzieren?


            Das mit dem Datum klingt plausibel. Hät man auch selber drauf kommen können.

            Thx
            Zuletzt geändert von Zumlin; 25.02.2007, 18:04.

            Kommentar


            • #7
              Ich hab schon in anderen Posts gelesen, dass man das, was ich gerne machen will, doch in der Where Klausel formulieren kann.
              Ich will, nur um das nochmal zu sagen, aus einer Tabelle "alle" User mit bestimmten Informationen abrufen und dazu noch aus einer anderen Tabelle die INforamtion "value" falls vorhanden hinzufügen. Danach will ich, was ich mit dem unteren Befehl schaffen will, dies nochmal machen jedoch nur die User mit der einem bestimmten "value" in meine Ergebniss-Tabelle einbeziehen.

              Mein Select Befehl:
              PHP-Code:
              SELECT user.useriduser.usernameuser.pointsuser.onlinetimeuser.lastaction
              user.sessionid AS sessioniduser.userpage AS userpageuser.birthdayadditional.value AS gender 
              FROM test_user user 
              LEFT OUTER JOIN test_profile_field_value additional 
              ON additional
              .userid user.userid AND additional.feldid=
              WHERE additional
              .value 
              ORDER BY username ASC LIMIT 0
              ,15 
              Ersten kennt SQL "additional.value = 1" nicht was ich schonmal komisch finde. Jedoch verursacht "test_profile_field_value.value = 1" auch einen Fehler. Warum? Ich will doch nur alle user mit dem value=1 anzeigen lassen.

              Kommentar


              • #8
                Original geschrieben von Slava

                bei einem left-join wird "where" deine erste tabelle, die du eigentlich komplet sehen willst auf die in "where" passende datensätze reduziert.
                Also muss du deine bedingung von "where" in "ON" verschieben.
                das ist Quatsch, Slava

                Bei LEFT JOIN wird erstmal alle linksseitige Datensätze genommen, wenn was passend zu rechtsseitigen gibt, dann bekommst du Daten, ansonstens NULL, d.h. wenn du Ergebnisdatensätze reduzieren willst, dann bitte in WHERE unterbringen, denn wenn du die Bedingung in ON unterbringst, bekommst du Datensätze mit NULL in den nicht zutreffenden Spalten.

                Allgemein für Noobs: in ON sind Verknüpfungsbedingungen zu unterbringen und in WHERE die Bedingungen zur Filterung des Ergebnises.

                Kommentar


                • #9
                  Hmm so funktionierts teilweise:

                  PHP-Code:
                  SELECT user.useriduser.usernameuser.pointsuser.onlinetimeuser.lastaction
                  user.sessionid AS sessioniduser.userpage AS userpageuser.birthdayadditional.value AS gender 
                  FROM test_user user 
                  LEFT OUTER JOIN test_profile_field_value additional 
                  ON additional
                  .userid user.userid AND additional.feldid=
                  WHERE additional
                  .value 
                  ORDER BY username ASC LIMIT 0
                  ,15 
                  Die Ausgabe ist richtig. Lediglich ein Fehler wird mit ausgegeben:
                  SQL Abfrage: SELECT userid FROM test_user WHERE additional.value = 1
                  Fehler:Unknown column 'additional.value' in 'where clause'
                  URL:/test56/userlist.php
                  Zeit:26.02.2007 - 18:02

                  Ist komisch.

                  Kommentar


                  • #10
                    Original geschrieben von asp2php
                    das ist Quatsch, Slava

                    Bei LEFT JOIN wird erstmal alle linksseitige Datensätze genommen, wenn was passend zu rechtsseitigen gibt, dann bekommst du Daten, ansonstens NULL, d.h. wenn du Ergebnisdatensätze reduzieren willst, dann bitte in WHERE unterbringen, denn wenn du die Bedingung in ON unterbringst, bekommst du Datensätze mit NULL in den nicht zutreffenden Spalten.

                    Allgemein für Noobs: in ON sind Verknüpfungsbedingungen zu unterbringen und in WHERE die Bedingungen zur Filterung des Ergebnises.
                    ich glaube, dass er die Linke tabelle auch komplett sehen wollte.
                    sonnst hat es kein Sinn left join zu nutzen.
                    Mysql ist was besonderes und nach der where bedingung wird Left join gar nicht beachtet und die ergebnisen werden so reduziert, ob es überhaupt kein Left join gegeben hätte, also der Wünsch die Linke Tabelle anzuschauen wird nicht mehr beachtet.
                    Zuletzt geändert von Slava; 26.02.2007, 18:09.
                    Slava
                    bituniverse.com

                    Kommentar


                    • #11
                      Original geschrieben von Zumlin
                      Die Ausgabe ist richtig. Lediglich ein Fehler wird mit ausgegeben:
                      SQL Abfrage: SELECT userid FROM test_user WHERE additional.value = 1
                      Fehler:Unknown column 'additional.value' in 'where clause'
                      URL:/test56/userlist.php
                      Zeit:26.02.2007 - 18:02
                      existiert die Spalte value? Wenn ja, dann mach mal so:

                      ... WHERE `additional`.`value` = 1

                      Kommentar


                      • #12
                        oder nimm "AS gender" einfach weg
                        Slava
                        bituniverse.com

                        Kommentar


                        • #13
                          Original geschrieben von Slava
                          oder nimm "AS gender" einfach weg
                          sollte das nicht egal sein...?
                          Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
                          var_dump(), print_r(), debug_backtrace und echo.
                          Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
                          Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
                          Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

                          Kommentar


                          • #14
                            ich sehe kein AS, zumindest nicht in der Fehlermeldung, denn da steht:
                            SQL Abfrage: SELECT userid FROM test_user WHERE additional.value = 1
                            außerdem selbst wenn, es ist egal, denn Spaltenalias kann man nur in order by verwenden sonst nirgends

                            Kommentar


                            • #15
                              Original geschrieben von asp2php
                              existiert die Spalte value? Wenn ja, dann mach mal so:

                              ... WHERE `additional`.`value` = 1
                              Funktioniert leider nicht. Diese Schreibweise hab ich bis jetzt auch noch nirgends gelesen.

                              Der Vorschlag "AS gender " weg zu lassen kommt auch nicht in Frage, da ich das später noch verwende. Außerdem glaub ich nicht, dass das der richtige Weg ist.

                              Meine Dampfhammerlösung ist jetzt einfach, dass ich alle Fehler für diese Seite ausblenden lasse. Ist zwar nicht die beste Lösung, aber da ja das Ergebniss stimmt merkts dann auch keiner

                              Danke fürs mitgrübeln!

                              Kommentar

                              Lädt...
                              X