Pierwsze wolne w tablicy
Grzegorz Skaruz - 16-05-2006 00:15
Pierwsze wolne w tablicy Witam
Załóżmy że mam tablicę (w bazie MySQL) zawierajacą elementy: 1, 2, 3, 6, 17, 19, 28, 29, 30
W jaki sposób najprościej znaleźć pierwszą wolną "lukę", czyli w tym przypadku będzie to liczba 4. Oczywiście można lecieć for'em w PHP, ale to mało wydajne rozwiązanie - może być jako ostateczność.
Chyba że istnieje jakaś tego typu funkcja w MySQLu, wtedy liczby to pole ID (nie autonumer).
Na pl.comp.lang.php padła propozycja
SELECT b.id FROM tabela a LEFT JOIN tabela b ON a.id=b.id+1 WHERE b.id IS NULL ORDER BY b.id LIMIT 1
ale niestety zwraca tylko NULL -- Grzegorz Skaruz http://www.skaruz.com - prywatnie http://www.verdox.pl - firmowo http://www.mopsik.pl - pomocny w krzyżówce i w scrabble http://www.mydlandia.pl - sklep z kosmetykami naturalnymi http://www.almand.pl - biuro tłumaczeń
LECH DUBROWSKI - 16-05-2006 00:15
> SELECT b.id FROM tabela a > LEFT JOIN tabela b ON a.id=b.id+1 > WHERE b.id IS NULL > ORDER BY b.id LIMIT 1
To powinno byc dobre
SELECT b.id FROM b LEFT JOIN a ON a.id=b.id+1 WHERE b.id IS NULL ORDER BY b.id LIMIT 1
Leszek
> Grzegorz Skaruz
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 16-05-2006 00:15
LECH DUBROWSKI wrote: > > SELECT b.id > WHERE b.id IS NULL
Jesteś pewny, że tak to miało wyglądać? :)
-- P.M.
hubert depesz lubaczewski - 16-05-2006 00:15
Grzegorz Skaruz wrote: > SELECT b.id FROM tabela a
select a.id + 1 FROM tabela a
> LEFT JOIN tabela b ON a.id=b.id+1 > WHERE b.id IS NULL > ORDER BY b.id LIMIT 1
order by a.id limit 1
> ale niestety zwraca tylko NULL
po tych 2 modyfikacjach powinno byc ok. ale mam jedno "ale". czemu uwazasz, ze potrzebujesz zapelniac dziury?
depesz
-- http://www.depesz.com/ - nowy, lepszy depesz
Grzegorz Skaruz - 16-05-2006 00:15
Pięknego dnia Mon, 15 May 2006 10:53:15 +0200 hubert depesz lubaczewski <depesz@depesz.com> napisał:
Dzięki, działa dokładnie tak jak powinno.
>ale mam jedno "ale". czemu uwazasz, ze potrzebujesz zapelniac dziury?
Sprawa wygląda tak: baza książek gdzie numer ISBN jest identyfikatorem. Każda książka ma unikalny ISBN, chyba... że jest to książka ponad 35 letnia - wtedy nie ma numeru ISBN, a takie też trzeba dodać do bazy. Padł pomysł aby książki bez prawdziwych numerów ISBN miały zastępcze ISBNy liczące od 0. -- Grzegorz Skaruz http://www.skaruz.com - prywatnie http://www.verdox.pl - firmowo http://www.mopsik.pl - pomocny w krzyżówce i w scrabble http://www.mydlandia.pl - sklep z kosmetykami naturalnymi http://www.almand.pl - biuro tłumaczeń
Grzegorz Skaruz - 16-05-2006 00:15
Pięknego dnia Mon, 15 May 2006 10:53:15 +0200 hubert depesz lubaczewski <depesz@depesz.com> napisał:
>po tych 2 modyfikacjach powinno byc ok.
Pospieszyłem się nieco. 1 przypadek - tabela zawiera 17,18, 19 - powinno znaleźć 0 lub 1, znajduje 2 przypadek - tabela zawiera 0, 1, 2, 3 , 17 - znajduje 1, powinno 4 3 przypadek - tabela zawiera 0, 1, 3, 19 - znajduje 1, powinno 2 -- Grzegorz Skaruz http://www.skaruz.com - prywatnie http://www.verdox.pl - firmowo http://www.mopsik.pl - pomocny w krzyżówce i w scrabble http://www.mydlandia.pl - sklep z kosmetykami naturalnymi http://www.almand.pl - biuro tłumaczeń
=?iso-8859-2?Q?Krzysztof_Jod=B3owski?= - 16-05-2006 00:15
> Sprawa wygląda tak: baza książek gdzie numer ISBN jest > identyfikatorem. Każda książka ma unikalny ISBN, chyba... że jest to > książka ponad 35 letnia - wtedy nie ma numeru ISBN, a takie też trzeba > dodać do bazy. Padł pomysł aby książki bez prawdziwych numerów ISBN > miały zastępcze ISBNy liczące od 0.
To raczej zły pomysł z tymi numerami od 0 (pod względem formalnym a nie bazodanowym). A pod względem bazodanowym z tym ISBN jako identyfikatorem też nie najlepszy pomysł - niektóre książki (różne) są czasem wydawane pod jednym ISBNem. Na 90 tysięcy tytułów w bazie mamy takich ok. 2300. Nie lepiej będzie założyć oddzielny klucz auto_increment, a ISBN trzymać jako pole dodatkowe?
-- pozdrawiam Krzysztof Jodłowski http://www.wysylkowo.pl
Grzegorz Skaruz - 16-05-2006 00:15
Pięknego dnia Mon, 15 May 2006 11:33:50 +0000 (UTC) Krzysztof Jodłowski <bluelaser@poczta.onet.pl> napisał:
>To raczej zły pomysł z tymi numerami od 0 (pod względem formalnym a nie >bazodanowym). >A pod względem bazodanowym z tym ISBN jako identyfikatorem też nie >najlepszy pomysł - niektóre książki (różne) są czasem wydawane pod jednym >ISBNem. Na 90 tysięcy tytułów w bazie mamy takich ok. 2300. >Nie lepiej będzie założyć oddzielny klucz auto_increment, a ISBN trzymać >jako pole dodatkowe?
NIe zajmowałem się tym projektem od jego początku, a jedynie go przejąłem i na zlecenie dodaję nową funkcjonalność. Przekażę sugestię właścicielowi. Problem w tym że z serwisu korzystają już użytkownicy więc zmiana takiego mechanizmu pociągałaby za sobą spore przestoje i wiele testów. -- Grzegorz Skaruz http://www.skaruz.com - prywatnie http://www.verdox.pl - firmowo http://www.mopsik.pl - pomocny w krzyżówce i w scrabble http://www.mydlandia.pl - sklep z kosmetykami naturalnymi http://www.almand.pl - biuro tłumaczeń
hubert depesz lubaczewski - 17-05-2006 00:40
Grzegorz Skaruz wrote: > Pospieszyłem się nieco. > 1 przypadek - tabela zawiera 17,18, 19 - powinno znaleźć 0 lub 1, > znajduje
w skrocie - zapomnij. w postgresie nowym sie da. jak zrobisz dodatkowa tablice z liczbami naturalnymi - da sie. ale samo z siebie sie nie da.
> 2 przypadek - tabela zawiera 0, 1, 2, 3 , 17 - znajduje 1, powinno 4 > 3 przypadek - tabela zawiera 0, 1, 3, 19 - znajduje 1, powinno 2
fix: select a.id + 1 FROM tabela a LEFT JOIN tabela b ON a.id + 1 =b.id WHERE b.id IS NULL order by a.id limit 1 ;
depesz
-- http://www.depesz.com/ - nowy, lepszy depesz
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
=?ISO-8859-2?Q?=5BOracle=5D_Porownanie_wierszy_z_tych_?==?ISO-8859-2?Q?samych_tablic_na_2_r=F3=BFnych_schematach?=
[MySQL] Jak wybrac wiele elementow powiazanych z jednym elementem innej tablicy?
[oracle] =?ISO-8859-2?Q?=A3=B1czenie_dw=F3ch_tablic_=3F?=
[MS SQL 2005 EXPRESS] Uprawnienia do pól w tablicy
[VBA] Dynamiczne tworzenie tablic w bazie MSAccess
Zapytanie SQL, wyszukiwanie strony tablicy
[oracle] Funkcja zwracajaca typ tablicowy
Dynamiczna tablica w SQL Server 2000
Jak dodać tablicę z PHP do tabeli MySQL
zanotowane.pldoc.pisz.plpdf.pisz.plmisida.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|