Ankündigung

Einklappen
Keine Ankündigung bisher.

If in Where

Einklappen

Neue Werbung 2019

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

  • If in Where

    Ich habe eine Tabelle mit einem Feld User. Der User ist in dem Fall eine Nummer (Integer). Dazu noch ein Kotrollfeld. Das kann für mehrere User gleich sein.
    Ich möchte nun abfragen, ob es einen Datensatz zu einer bestimmten Usernummer gibt. Da aber auch die 0 vergeben werden kann, soll da eine Unterscheidung erfolgen.

    Ich möchte also eine Abfrage haben, die nach dem control Feld und der UserId sucht.

    SELECT ..... FROM ...... WHERE control = 1 AND (userID = 2 OR userUD = 0)

    soweit so gut. Aber ich möchte nur den Datensatz haben, der mit der Nummer übereinstimmt und nur wenn das nicht passt den mit userID 0

    In der DB steht es so

    control userID
    1 2
    1 0

    Meine obige Abfrage bringt beide DS als Ergebnis. Ich möchte aber nur den, bei dem die userID direkt passt, nur wenn die userID nicht passt, soll er den mit 0 ausgeben und wenn es den auch nicht gibt, soll nix zurückkommen.

    Ich hoffe, ich konnte mich verständlich machen. Aber wie löse ich das?


  • #2
    evt. mit ORDER BY userID DESC LIMIT 1

    Kommentar


    • #3
      leider nicht, es geht ja nicht nur um einen DS, da stehen ein paar 1000 drin, ich möchte immer nur die auf die die Nummer zutrifft

      Kommentar


      • #4
        könnte funktionieren ...

        Dynamisch musst du nur die 1 bei a.control machen und die 2 ganz am Ende vor den zwei ))

        Code:
        select * from tabelle as a where a.control = 1 and (a.userID = if((select count(*) from tabelle as b where b.control = a.control and b.userID = 0) = 1,0,2))
        BTW.: bitte kein * verwenden ...

        Kommentar


        • #5
          Zitat von psygonis Beitrag anzeigen
          leider nicht, es geht ja nicht nur um einen DS, da stehen ein paar 1000 drin, ich möchte immer nur die auf die die Nummer zutrifft
          Häng den Code von HPR1974 an deinen Query und schau was rauskommt.

          Kommentar


          • #6
            Warum muß sowas immer mit Macht allein von der Datenbank erledigt werden?
            Eine Abfrage mit der UserID machen und wenn diese kein Resultat bringt eine Abfrage mit UserID = 0 hinterher schicken. Dies mit PDO Prepared Statements gemacht möchte ich fast wetten ist genau so schnell wie eine SQL mit einem Subselect a.la
            Code:
            SELECT .. 
            FROM tab as t1 
            WHERE userID = IF(
              (SELECT userID FROM t1 WHERE userID = :userID LIMIT 1), :userID ,0)
            LG jspit

            Edit: Wenn nur ein Datensatz als Resultat in Frage kommt, dann sollte das mit dem Code von HPR1974 funktionieren.
            Nicht aber wenn das Oben wieder nur die halbe Wahrheit ist und die Tabelle so aussehen kann

            control userID nochwas
            1 2
            1 0
            1 2
            3 4
            3 2
            PHP-Klassen auf github

            Kommentar


            • #7
              doch, die Tabelle sieht genauso aus, deshalb klappt ja order by nicht

              kannst Du mir das

              userID = IF(
              (SELECT userID FROM t1 WHERE userID = :userID LIMIT 1), :userID ,0)

              bitte noch erklären?
              was bedeuten die Doppelpunkte ?

              Kommentar


              • #8
                Mach es uns doch einfacher und gib mal konkrete Beispiele vor: http://sqlfiddle.com
                Relax, you're doing fine.
                RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                Kommentar


                • #9
                  was denn für Errors? von Fehlern habe ich nichts gesagt. es geht nur um die Syntax des mysqlSQL strings. weiter nichts.

                  Kommentar


                  • #10
                    Zitat von psygonis Beitrag anzeigen

                    kannst Du mir das

                    userID = IF(
                    (SELECT userID FROM t1 WHERE userID = :userID LIMIT 1), :userID ,0)

                    bitte noch erklären?
                    was bedeuten die Doppelpunkte ?
                    :userID ist nur der Platzhalter für die konkrete userID, wie er bei Prepared Statements benutzt wird.
                    Um bei deinen obigen Ansatz zu bleiben, wäre das z.B. die 2.
                    Der SELECT in der Klammer wird zuerst ausgeführt und liefert ein Ergebnis,
                    wenn mindestens ein Datensatz mit der 2 (:userID) gefunden wird.
                    Durch LIMIT 1 wird die Suche nach den ersten Fund abgebrochen, was die Sache etwas beschleunigt.
                    Dann wird IF ausgewertet. Der Ausdruck liefert die 2 ( :userID ) wenn ein Ergebnis vorliegt und eine 0 wenn nicht.
                    Dann wird die aüßere Selectanweisung ausgeführt, die dann nach der 2 (:userID) oder der 0 sucht.
                    Weitere Bedingungen wie a.control = 1 mußt du da noch mit einbauen.

                    Das sind aber weitgehend noch Grundlagen. Für jemanden, der sein Kenntnisstand als Fortgeschritten einstuft, wird hier erwartet das er nach ein paar Stichpunkten selbst die Lösung findet.

                    Mir ist noch nicht der Aufbau deiner Tabelle klar.
                    Es wäre hilfreich, den Vorschlag von VPh zu nutzen und ein Beispiel zu erstellen welches mehr als nur 2 Datensätze enthält.
                    Das Tool ist sehr gut geeignet, SQL-Anweisungen losgelöst vom PHP-Script zu testen.

                    LG jspit
                    PHP-Klassen auf github

                    Kommentar


                    • #11
                      also wenn der Inhalt Deiner Tabelle mehr als 2 Datensätze als Lösung zulässt
                      z.B.
                      control userID nochwas
                      1 2
                      1 0
                      1 2
                      Dann gibt es mit den Informationen auch kein sql Statement, das Dir den gewünschten Datensatz eindeutig liefert. Dazu brauchst Du ein weiteres Kriterium.

                      Kommentar

                      Lädt...
                      X