Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Znalezienie najniższej wolnej liczby
Forum PHP.pl > Forum > PHP
adrix88
Witam. Chciałbym prosić was o pomoc. Myślę sobie już od kilku godzin i nie mam pomysłu jak to można rozwiązać. Otóż muszę napisać skrypt który znajdzie mi w bazie danych najniższą wolną liczbę spośród dostępnych w bazie danych. Wszelkie pomysły/sugestie są bardzo mile widziane.

Pozdrawiam.
blooregard
MIN(X)-1 ?
adrix88
Ta funkcja chyba odpada, bo zapomniałem wspomnieć, ale liczby mają być z pewnego zakresu np. 100-200 i mam znaleźć najniższą wolną liczbę, a nie o 1 mniejszą od najniższej z dodanych.
Zyx
A warunki WHERE oraz HAVING to od czego są? Ogranicz sobie nimi zakres poszukiwań i gotowe.
gutek84
select min(col_liczb) as najmniejsza_wolna_liczba from tabela where col_liczb between 100 and 200 and col_licz_zabl = 0

col_liczb - kolumna z liczba
col_licz_zabl - kolumna z flagą czy zablokowana czy nie

cos takiego?

select min(col_liczb) from tabela where col_licz_zabl = 0 having min(col_liczb)>100;
adrix88
Można prosić o jakaś podpowiedź jak mniej więcej powinno wyglądać zapytanie z HAVING? Bo nie mogę sobie wyobrazić jak to HAVING może mi wyfiltrować najniższą liczbę która się nie powtarza.

@gutek84
Twoje zapytanie jakoś nie chce mi zadziałać, ogólnie to nie wiem po co jest ta kolumna col_licz_zabl, bo aktualnie w swojej bazie danych przechowuję tylko i wyłącznie liczby które są już zajęte, bo chyba nie ma sensu nadawania im dodatkowych flag, bo co to da ;>


@ EDIT

Nie wiem czy mnie dobrze rozumiecie, ale chodzi mi o to że mam określony przez aplikację zakres wartości:

od 20000 do 50000

Liczba która jest poszukiwana jest to najniższa wartość z powyższego zakresu, która nie istnieje w bazie danych.

Proszę o jakąś konkretną radę, bo siedzę już nad tym pół dnia i efektów nadal nie widać.
Zyx
Sprawdź ten artykuł:

http://www.xaprb.com/blog/2005/12/06/find-...uence-with-sql/

Opisane w nim rozwiązania najszybsze nie są (uroki SQL-a przy pracy z nieistniejącymi danymi, mimo iż algorytmicznie to można prosto zrobić), ale działają i zwracają wszystkie luki numeracji. Ty musisz po prostu dodać ograniczenie na zakres, pobrać pierwszą lukę i gotowe.

PS. A na przyszłość to pisz takie rzeczy w pierwszym poście, a nie po długiej dyskusji, bo faktycznie nie do końca się rozumieliśmy smile.gif.
Pilsener
Cytat
najniższa wartość z powyższego zakresu, która nie istnieje w bazie danych


  1. $pytek = "select liczby from tabela where (liczby BETWEEN 200 AND 500) order by liczby";
  2. $pyt = mysql_query($pytek);
  3. while($dane = mysql_fetch_assoc($pyt)){
  4. if(){
  5. break;
  6. }
  7. }


Ja bym pobrał wszystkie liczby i sprawdzał, czy bieżąca minus poprzednia równa się jeden, jeśli nie to mamy wolne miejsce, które wynosi poprzednia liczba plus jeden, oczywiście wtedy przerywamy pętlę while. Pozostaje przetestować wydajność i zastosować jedno z rozwiązań.
thek
Jedyne w miarę sensowne działanie to stworzenie fikcyjnej tabeli o wartościach z zakresu A do B z założonym indexem (nazwijmy ją fiction) na jedyna kolumnę w nim o nazwie przypuśćmy "i" i zapytanie
  1. SELECT MIN(i) FROM fiction WHERE i NOT IN ( SELECT id FROM ta_druga )
Kiedyś na zajęciach wiem, że mówiła kobitka o fikcyjnych tabelach w SQL do jakich się można odwoływać choćby w przypadku jakichś działań matematycznych, ale to była ciekawostka i teraz nazwy tej tabeli nie kojarzę. Możliwe, że dzięki niej można by było w locie stworzyć taki zakres od A do B. Żebym to tylko ja pamiętał jak ona się nazywała sad.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.