Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pobranie 1 wolnego id z pola typu auto_increment
Ania-678
post
Post #1





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

Ostrzeżenie: (0%)
-----


Witam.
Jestem na tym forum nowa i przejdę do sedna sprawy...

Otóż jest Mi potrzebne funkcja która Mi pobierze pierwszy WOLNY numer rekordu z pola typu auto_increment.

I w zasadzie to chyba znalazłam co Mnie potrzeba -> http://algorytmy.pl/?id=1064&pp=503

Ale jest małe ale:

UWAGA! To tylko fragment strony! Całą zobaczysz po opłaceniu abonamentu! (IMG:http://forum.php.pl/style_emoticons/default/ohmy.gif)

A trochę dużo tam wołają za SMS'a zaś karty nie posiadam...

Może ktoś zna inne miejsce gdzie to znajdę albo Sam też wie jak takie coś napisać bo jest Mi bardzo potrzebne.

EDIT: Pracuję na php 4/5 oraz mysql 4.1.21-standard

Pozdrawiam i czekam na pomoc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Ania-678 15.06.2007, 10:31:00
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Kicok
post
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


Cytat("UDAT")
Jedyne rozwiązanie, które działa jest przedstawione w moim poście, gdyż jeśli nie ma najmniejszej wartości to ją zwraca, jeśli nie to zwraca ID+1, którego nie ma w tabeli, sprawdzane dla każdego ID już istniejącego.


A mógłbyś podać przykładowe wartości, dla których twoje zapytanie działa? Bo jak bym tego nie testował, to zawsze zwraca mi: 0. Nawet dla danych:
Kod
0
1
2
3
5
6



Jeśli używa się MySQL5 to najprostszym wyjściem będzie napisanie prostej funkcji:
Kod
DROP FUNCTION IF EXISTS pierwsze_puste_id;

DELIMITER $
CREATE FUNCTION pierwsze_puste_id() RETURNS INT
BEGIN

  SET @ID = 1;
  SET @MAX_ID = ( SELECT MAX(id) FROM tabela );

  WHILE( @ID <= @MAX_ID )
  DO
    IF NOT EXISTS ( SELECT id FROM tabela WHERE ( id = @ID ) ) THEN
      RETURN( @ID );
    END IF;

    SET @ID = @ID + 1;
  END WHILE;

  RETURN( @ID );

END$
DELIMITER;
(zakładamy że id ma być dodatnie)


No chyba, że jest w MySQL'u odpowiednik: range" title="Zobacz w manualu PHP" target="_manual - to wtedy wystarczyłoby zwykłe podzapytanie.
Go to the top of the page
+Quote Post
UDAT
post
Post #3





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


Cytat(Kicok @ 16.06.2007, 21:57:15 ) *
A mógłbyś podać przykładowe wartości, dla których twoje zapytanie działa? Bo jak bym tego nie testował, to zawsze zwraca mi: 0. Nawet dla danych:
Kod
0
1
2
3
5
6

Zero zwraca tylko gdy nie ma pola o ID = 0, inaczej zwraca pierwsze nie istniejące, o jeden większe od już wpisanego. A co do twojego przykładu, to zobacz co mi MySQL zwrócił:
Kod
mysql> SELECT * FROM tabela;
+----+
| ID |
+----+
|  0 |
|  1 |
|  2 |
|  3 |
|  5 |
|  6 |
+----+
6 rows in set (0.00 sec)

mysql> SELECT IF(
    ->     NOT EXISTS (
    ->         SELECT id FROM tabela WHERE id=0
    ->     ),
    ->     0,
    ->    ( SELECT t1.id+1 FROM tabela t1
    ->      WHERE NOT EXISTS (
    ->             SELECT id FROM tabela WHERE id=t1.id+1
    ->      ) ORDER BY t1.id LIMIT 1
    ->     )
    -> ) as empty;
+-------+
| empty |
+-------+
|     4 |
+-------+
1 row in set (0.00 sec)


Masz pomysł dlaczego u mnie działa, a u Ciebie nie?
Jeśli chcesz numerację od 1 to zmień w 3. i 5. linii 0 na 1

Ten post edytował UDAT 17.06.2007, 09:49:59
Go to the top of the page
+Quote Post

Posty w temacie
- Ania-678   Pobranie 1 wolnego id z pola typu auto_increment   15.06.2007, 10:28:35
- - Cienki1980   Jeżeli potrzebujesz następnego id z pola auto_incr...   15.06.2007, 11:19:28
- - sticker   pierwszy wolny to znaczy ten który bedzie wstawio...   15.06.2007, 11:20:47
|- - skowron-line   Cytat(sticker @ 15.06.2007, 10:20:47 ...   15.06.2007, 11:59:50
- - SongoQ   Cytatmozesz np pobrac max(id) a potem w petli spra...   15.06.2007, 13:08:53
|- - skowron-line   Cytat(SongoQ @ 15.06.2007, 12:08:53 )...   15.06.2007, 13:17:40
- - Ania-678   Więc tak... Nie chodzi Mnie o zmianę au...   15.06.2007, 13:34:53
- - SongoQ   aaaaa @skowron-line Zle sobie odczytalem chodzilo ...   15.06.2007, 13:37:15
|- - Ania-678   Cytat(SongoQ @ 15.06.2007, 14:37:15 )...   15.06.2007, 16:08:53
- - kwiateusz   źle rozumiesz to jest jedna tabela ł...   15.06.2007, 16:19:11
- - Ania-678   To nie wiem czy dobrze podstawiam Swą nazw...   15.06.2007, 16:26:47
- - superfrajer   Niezbyt dobrze kombinujesz Dodaj do tabeli userow...   15.06.2007, 21:08:10
- - Norbas   @superfrajer Jaki jest związek tego co napisa...   15.06.2007, 22:44:55
- - Ania-678   No wynik jest pusty... Ale... ja to potrzebuję do...   15.06.2007, 23:38:08
- - SongoQ   Myslalem ze po moim poscie poradzisz sobie. Masz ...   16.06.2007, 08:08:13
- - Ania-678   Ten dziad: [SQL] pobierz, plaintext $aktiv = $db ...   16.06.2007, 09:20:54
- - UDAT   Spróbuj [SQL] pobierz, plaintext SELECT t1.id+1 F...   16.06.2007, 09:52:18
- - Ania-678   Ni jedno, ni drugie egzaminu nie zdaje...   16.06.2007, 10:42:02
- - superfrajer   Norbas: taki jest zwiazek, ze dziewczyna troche be...   16.06.2007, 12:15:59
- - UDAT   A to: [SQL] pobierz, plaintext SELECT IF( ...   16.06.2007, 12:47:20
- - Ania-678   Po wywołaniu zapytania w PMA "sprzedał" ...   16.06.2007, 13:58:29
- - SongoQ   2 razy odpowiedzialem na to pytanie. Problem jest ...   16.06.2007, 16:26:28
|- - UDAT   Cytat(SongoQ @ 16.06.2007, 17:26:28 )...   16.06.2007, 16:55:56
- - Kicok   To zadanie nie jest takie proste, jakie się wydaje...   16.06.2007, 17:33:55
|- - UDAT   Cytat(Kicok @ 16.06.2007, 18:33:55 ) ...   16.06.2007, 18:57:07
- - Kicok   Cytat("UDAT")Jedyne rozwiązanie, które d...   16.06.2007, 20:57:15
|- - UDAT   Cytat(Kicok @ 16.06.2007, 21:57:15 ) ...   17.06.2007, 09:48:59
- - Ania-678   Już mam, znalazłam człowieka który miał konto na t...   16.06.2007, 21:57:18
- - Kicok   CytatMasz pomysł dlaczego u mnie działa, a u Ciebi...   17.06.2007, 10:32:19
- - eai   CytatJuż mam, znalazłam człowieka który miał konto...   20.06.2007, 14:44:00
- - UDAT   Poprawiona wersja: Kodmysql> SELECT IF( -...   20.06.2007, 16:12:21
- - eai   mysql> SELECT IF(min(id)<1, -> 1,...   20.06.2007, 16:22:18


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 16:49