stephan: SQL abfrage

Hi,

wie kann ich die nächste freie Zahl im Feld ID herausfinden, die größer/kleiner der Variable $intids ist?

Danke

STEPHAN

  1. yo,

    wie kann ich die nächste freie Zahl im Feld ID herausfinden, die größer/kleiner der Variable $intids ist?

    mal davon abgesehen, dass es sich wahrscheinlich um ein auto-increment wert handelt, habe ich keinen blassen schimmer, welches problem du hast, geschweige denn, welches dbms du benutzt und was du erreichen willst.

    Ilja

    1. hi,

      mal davon abgesehen, dass es sich wahrscheinlich um ein auto-increment wert handelt, habe ich keinen blassen schimmer, welches problem du hast, geschweige denn, welches dbms du benutzt und was du erreichen willst.

      hi, ne, kein auto increment... ich habe ein anderes feld (IDD), das zählt. und jetzt habe ich dieses id feld mit zahlen. sql-db. und ich muss jetzt herausfinden, welches die nächst größere zahl/kleinere zahl (falls es eine gibt) ist.

      danke!

      1. Hallo,

        hi, ne, kein auto increment... ich habe ein anderes feld (IDD), das zählt.

        Wie meinen bitte mit "das zählt"?

        [ ] Es zählt selbst (in der Datenbank selbst ohne dass irgendeinen explizit von ausserhalb einen neuen (hochgezählten) Wert angeben muss? => Auto Increment

        [ ] im Sinne von "nur das zählt" => nur das soll interessant sein

        sql-db.

        SQL = Structured Query Language = eine standardisierte Sprache zur Abfrage von relationalen Datenbanken.
        MySQL, MS SQL, Oracle, PostGre, und weiss der Teufel was sonst noch mit SQL bedient werden kann. Also nochmal: Welches Datenbanksystem?

        und ich muss jetzt herausfinden, welches die nächst größere zahl/kleinere zahl (falls es eine gibt) ist.

        Dann finde einen Datensatz, der in der betreffenden Spalten einen Wert grösser deinem Vergleichswert hat. Bzw. Finde den Datensatz der von allen in derselben Tabelle den MAXimalsten Wert für die Spalte hat.
        Für das eine benutzt du > für das andere MAX(#spalte#).

        Bemühe dich in Zukunft bitte mehr, dein Problem zu detaillierter beschreiben.

        Grüsse,
        Frank

        1. hi,

          okay, 3. anlauf ;)

          Wie meinen bitte mit "das zählt"?

          [x] Es zählt selbst (in der Datenbank selbst ohne dass irgendeinen explizit von ausserhalb einen neuen (hochgezählten) Wert angeben muss? => Auto Increment

          MySQL, MS SQL, Oracle, PostGre, und weiss der Teufel was sonst noch mit SQL bedient werden kann. Also nochmal: Welches Datenbanksystem?

          ms sql

          Für das eine benutzt du > für das andere MAX(#spalte#).

          das problem ist aber, dass wenn in der db dann steht 1 2 4 5 6 und in meiner variable steht 2, dann müsste ich irgendwie rausbekommen, dass 3 noch nicht belegt ist...
          geht das?

          Bemühe dich in Zukunft bitte mehr, dein Problem zu detaillierter beschreiben.

          versucht... besser? =)

          stephan

          1. Hallo,

            eine ID ist ein Identifier, also ein Wert, mit dem man Datensätze eindeutig identifizieren kann. Daher _darf_ eine ID eines gelöschten Datensatzes nicht beim nächsten Datensatz wieder verwendet werden. Immerhin könnten auf Basis dieser ID Kundennummern, Rechnungsnummern oder Referenzen zu anderen Tabellen existieren.

            Mir ist nicht ganz klar, wofür Du eine lückenlose Zahlenfolge in Deiner Tabelle haben möchtest. Wenn Du erzählst, wofür Du das brauchst, kann Dir hier bestimmt jemand weiterhelfen.

            Gruß
            Olaf

            1. Hi,

              das ist die Kunden-ID, die man durch Klick auf einen Button mit pfeil nach rechts und nach links höher oder niedriger (wenn das geht) machen können soll...

              danke =)

              stephan

              1. Hi,

                das ist die Kunden-ID, die man durch Klick auf einen Button mit pfeil nach rechts und nach links höher oder niedriger (wenn das geht) machen können soll...

                Du suchst also IDs, die größer (bzw. kleiner) als die aktuelle ID sind - und willst diese Menge auf 1 limitieren.

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                Schreinerei Waechter
                O o ostern ...
                Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                1. Hi,

                  Korrektur:

                  Du suchst also IDs, die größer (bzw. kleiner) als die aktuelle ID sind

                  und willst diese Menge aufsteigend (bzw. absteigend) sortieren und die Anzahl der Elemente dann auf 1 limitieren.

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  Schreinerei Waechter
                  O o ostern ...
                  Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                  1. hi,

                    genau, und diese id darf noch nicht in der db verwendet werden...

                    danke=)

                    stephan

                    1. Hallo,

                      warum dieses denn nicht? Damit derjenige sieht, dass es für IDD 3 keinen Kunden gibt. Und genau dies tut man nicht. Für einen neuen Kunden sollten immer nur neue Identifikationen verwenden. Und es spielt weder für den nicht-technischen Geschäftsablauf noch aus technischer Sicht eine Rolle ob die Kundennummer 3 oder 45869 ist.

                      Stell dir vor, deine Bank würde nach deiner Kündigung deine Kontonummer an einen neuen Kunden vergeben und irgendjemand aus dem hintersten Kabuff vergisst, dein Konto zu löschen. Der neue Kunde hat dann evt. Zugriff zu deinem Konto.

                      Biete einen Button an "Neuen Kunden erfassen", der zeigt eine leere Eingabemaske und das Speichern verpasst ihm eine neue Kundennummer.

                      In Spalten mit AutoIncrement kannst du auch nicht einfach so einen Wert einfügen, das behält sich das System vor.

                      Wenn du es aber unbedingt nicht anders willst. Incrementiere deinen Vergleichswert ausserhalb (=vor der Abfrage) um 1 und Frage dann die Datenbank ob sie für diese Wert (2+1 = 3) einen Datensatz hat.

                        
                      IF NOT EXISTS(SELECT 1 FROM tabelle WHERE IDD = @deineVariable)  
                        SET IDENTITY_INSERT tabelle ON  
                        INSERT tabelle (Id, feld, feld)  
                        VALUES (3, NULL, NULL)  
                        SET IDENTITY_INSERT tabelle OFF  
                      END  
                        
                      SELECT feld, feld, feld FROM tabelle WHERE IDD = @deineVariable  
                      
                      

                      Es ist wieder optimal noch überhaupt sinnvoll, ein künstlich generiertes Problem so zu lösen.

                      Wenn du nicht willst, dass Lücken entstehen, dann verhindere physikalische Löschungen und setze nur ein Flag (active = 0 | 1) für den Datensatz. Dieses Flag kannst du dann zusätzlich auswerten und die Anzeige entsprechend anders gestalten.

                      Cheers,
                      Frank

          2. Ja, schon etwas besser. (du hättest es eben schon im Ausgangsposting bringen können)

            Du willst den nächst höheren der existiert oder einen numerisch um X höheren der evt. nicht existiert und wissen ob dieser existiert?

            Wenn ich das nochmal durchlese, drängt sich mir der Gedanke auf, du möchtest Auto-Increment Lücken füllen? Das macht man eigentlich nicht. Über das warum gibt es hier im Forum seitenweise Beiträge. Ich bezweifle, dass du ausgerechnet einer der Fälle bist, wo man das eigentliche Problem nicht auf elegantere und vorallem andere Weise lösen könnte. Im konkreten Fall versuchst du jetzt schon ein künstliches Problem zu lösen "wie bekomme ich die Lücken", was den Aufwand nicht wert ist.

            Bei einem integer unterscheiden sich Werte für auto-increment immer um mindestens 1. D.h. du suchst einen Datensatz, der genau in Spalte IDD eine 3 drinstehenhat, bei Vergleichswert 2677 dann halt 2678? Richtig?

            SELECT CASE WHEN EXISTS(SELECT 1 FROM tabelle WHERE IDD = (@deinVergleichwert + 1)) THEN 1 ELSE 0 END

            Andere Situation, deine Zahlenreihe in IDD ist weiterhin 1 2 4 5 6, deine Variable aber 1, willst du dann immer noch 3 als Ergebnis haben?

            Ciao, Frank

            1. puha, das hab ich jetzt nicht ganz geblickt =)

              das feld ID ist für Kunden-ID-Nummern, IDD ist die typische Auto-Increment-ID. Und der benutzer soll über Buttons nach rechts / Links die nächst höhere/kleinere Nummer für den Kunden wählen können...

              danke =)

              stephan

              1. Hi,

                na dann

                  
                SELECT TOP 1 feld, feld, feld  
                FROM tabelle  
                WHERE IDD > @deineVariable  
                ORDER BY IDD  
                
                

                gibt dir den 1. Datensatz, dessen IDD grösser als dein Vergleichswert ist. Das ORDER BY ist wichtig für TOP n SELECTs.

                Das ganze schreibst du dir einfach als StoredProcedure mit einem Eingabeparameter und rufst sie für Buttonklick "rechts" auf.

                Für Rückwärtslaufen "links" brauchst du nur > in < ändern.

                Cheers,
                Frank