Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Znalezienie najniższej wolnej liczby
adrix88
post
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


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.
Go to the top of the page
+Quote Post
blooregard
post
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




MIN(X)-1 ?


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
adrix88
post
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


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.
Go to the top of the page
+Quote Post
Zyx
post
Post #4





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


A warunki WHERE oraz HAVING to od czego są? Ogranicz sobie nimi zakres poszukiwań i gotowe.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
gutek84
post
Post #5





Grupa: Zarejestrowani
Postów: 116
Pomógł: 4
Dołączył: 9.10.2007
Skąd: Morąg

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


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;

Ten post edytował gutek84 4.03.2010, 15:01:39
Go to the top of the page
+Quote Post
adrix88
post
Post #6





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


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ć.

Ten post edytował adrix88 4.03.2010, 16:05:11
Go to the top of the page
+Quote Post
Zyx
post
Post #7





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


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.

Ten post edytował Zyx 4.03.2010, 19:00:59


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Pilsener
post
Post #8





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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ń.
Go to the top of the page
+Quote Post
thek
post
Post #9





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 05:09