split.s: mysql-Frage: IF

Ich habe folgendes Problem: Ich vergleiche zwei Tabellen miteinander, wobei ich NICHT weiss, ob ein Wert NULL ist.

Hier ein Muster:

SELECT user.name FROM user.alter < suche.alter

Das Problem: suche.alter kann auch NULL sein! In diesem Fall möchte ich nicht danach suchen.
Ich bräuchte also sowas:

SELECT user.name FROM IF(suche.alter IS NOT NULL, user.alter < suche.alter,SONST-NIX-MACHEN);

  1. Hello,

    SELECT user.name FROM user.alter < suche.alter

    was ist denn hier from und was ist where und überhaupt: wo willst du hin?

    Eine syntaktische Verknüpfung von user.alter<suche.alter mit OR bzw. AND und IS NULL oder IS NOT NULL ist möglich.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. Hello,

      »» SELECT user.name FROM user.alter < suche.alter
      was ist denn hier from und was ist where und überhaupt: wo willst du hin?

      Eine syntaktische Verknüpfung von user.alter<suche.alter mit OR bzw. AND und IS NULL oder IS NOT NULL ist möglich.

      MfG
      Rouven

      WHERE habe ich lediglich vergessen:

      SELECT user.name FROM user, suche WHERE user.alter < suche.alter

      Ich möchte: user.alter < suche.alter (Das Alter der Benutzer soll kleiner sein, als das der Suchabfrage. Es kann aber sein, dass in der Suchabfrage kein Alter angegeben ist. Dann wäre dort das Alter NULL)

      Es kann also sein, dass suche.alter gleich NULL ist! Das hätte folgendes zur Folge:

      ... WHERE user.alter < NULL

      1. Hello,

        SELECT user.name FROM user, suche WHERE user.alter < suche.alter

        du hast eine Suchabfrage in der Tabelle gespeichert? Das erscheint mir zwar wenig sinnvoll, aber vmtl. weißt du besser als ich was du da machst...

        Für Joins empfiehlt sich im allgemeinen eine explizite Schreibweise, sie weist klar aus, was wie zusammengehört, vgl. unsere Datenbankartikel zu Joins.

        Es kann also sein, dass suche.alter gleich NULL ist! Das hätte folgendes zur Folge:

        du sprichst bildlich, oder? Das Statement bleibt ja unverändert. Du möchtest also alle Datensätze, bei denen das alter kleiner ist als die Suchangabe, oder bei denen es gar keine Suchangabe gibt. Hervorragende Anwendung für einen LEFT-JOIN:

          
        SELECT user.name  
        FROM user LEFT JOIN suche  
        ON user.alter < suche.alter  
        
        

        Alternativ in einer Nicht-Left-Join-Variante:

          
        SELECT user.name  
        FROM user, suche  
        WHERE (user.alter < suche.alter) OR (suche.alter IS NULL)  
        
        

        Irgendetwas sagt mir aber, dass du in beiden Fällen noch nicht so 100% dein erwartetes Ergebnis bekommen wirst, da du defacto ein volles Kreuzprodukt bildest und davon doch eine ganze Menge an Sätzen überbehälst. Aber wie gesagt, du wirst deine Datenstruktur besser kennen als ich.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Death is nature's way of telling you to slow down.
        1. yo Rouven,

          wenn ich sie richtig verstanden habe, dann ist "suche.alter" keine neue tabelle, sondern einfach nur eine variable, die von aussen kommt....

          Ilja

          1. yo Rouven,

            wenn ich sie richtig verstanden habe, dann ist "suche.alter" keine neue tabelle, sondern einfach nur eine variable, die von aussen kommt....

            Ilja

            Es gibt zwei Tabellen:

            suche:

            id MEDIUMINT(8) UNSIGNED AUTO_INCREMENT PRIMARY KEY
            alter INT(2) NULL
            geschlecht TINYINT(2) NULL

            user:
            id MEDIUMINT(8) UNSIGNED AUTO_INCREMENT PRIMARY KEY
            name VARCHAR(255) NOT NULL
            alter INT(2) NULL
            geschlecht TINYTINT(2) NOT NULL

            in der suche-Tabelle sind Suchparameter gespeichert.
            In der user-Tabelle befinden sich die Benutzer, die durchsucht werden sollen, und zwar so:

              
            SELECT user.name FROM suche, user WHERE user.geschlecht = suche.geschlecht AND user.alter = suche.alter  
            
            

            Mein Problem ist nur folgendes:
            Wenn suche.alter oder suche.geschlecht gleich NULL ist, dann sucht er in der user-Tabelle auch nach NULL-Werten!
            Ich will aber, dass er die Bedingung dann garnicht abfragt!

            Also ich will im prinzip sowas:

              
            SELECT user.name FROM suche, user WHERE IF(suche.geschlecht IS NOT NULL, user.geschlecht = suche.geschlecht, '') AND IF(suche.alter IS NOT NULL, user.alter = suche.alter, '')  
            
            
      2. yo,

        Ich möchte: user.alter < suche.alter (Das Alter der Benutzer soll kleiner sein, als das der Suchabfrage. Es kann aber sein, dass in der Suchabfrage kein Alter angegeben ist. Dann wäre dort das Alter NULL)

        unabhängig, von wo der wert herkommt, enie variable oder als unterabfrage, musst du dir erst enimal überlegen, was du dann haben willst, wenn der Wert NULL ist (NULL <> ''). wilsst du dann alle anzeigen, die dort kein alter angegeben haben oder willst du dann grundsätzliche alle anzeigen ?

        Ilja

        1. Hi ilja,

          Wenn suche.alter NULL ist, dann soll keine Altersbegrenzung stattfinden.

          Anders formuliert: Wenn suche.alter NULL ist, soll das Alter garnicht abgefragt werden weil dann will der Benutzer ja auch keins haben.

          1. yo,

            Anders formuliert: Wenn suche.alter NULL ist, soll das Alter garnicht abgefragt werden weil dann will der Benutzer ja auch keins haben.

            entweder passt du die sql query an, je nachdem ob es dort einen NULL wert gibt oder nicht. oder aber du benutzt einen trick, indem du eine funktion einsetzt, die nach NULL prüft und wenn der inhalt NULL ist, dann einen anderen wert einsetzt und zwar user.alter + 1. damit stellst du sicher, dass die Bedingung immer erfüllt ist und somit jedes alter angezeigt wird.

            Ilja

        2. wilsst du dann alle anzeigen, die dort kein alter angegeben haben oder willst du dann grundsätzliche alle anzeigen ?
          Ilja

          Letzteres!!!!!