propheti
27.09.2006, 13:43:22
Witam,
zna ktoś może sposób na to, aby przy dodawaniu nowego rekordu (powiedzmy, przy rejestracji), skrypt wyszukiwał "dziury" w rekordach, i wstawiał je właśnie w te miejsca.
Powiedzmy że mam coś takiego:
usera - id 1
userb - id 2
userd - id 4
Chce aby po rejestracji użytkownik posiadał id 3.
Dobrze by było, aby uzupełniało dopiero od danej wartości. Powiedzmy że od id 50, wszystkie wcześniejsze będą ignorowane.
mike
27.09.2006, 13:47:56
A po co chcesz to robić?
Przecież to bez sensu.
propheti
27.09.2006, 14:07:15
Otóż właśnie nie!
Mam zamiar wykorzystać to w grze, która opiera się na id, i wszelkie akcje wykonywane w niej jak naprzykład przekazanie złota bądź danego przedmiotu, wymaga podania id, a po kilku miesiącach rejestracji userów id są rzędu 6000-7000, co źle wpływa na wygode samej gry.
nospor
27.09.2006, 14:12:54
Cytat
a po kilku miesiącach rejestracji userów id są rzędu 6000-7000, co źle wpływa na wygode samej gry
a w jaki sposob to źle wplywa? Wybacz, ale nie rozumiem. Dziury w numeracji w kazdej aplikacji nie powinny miec zadnego zlego wplywu
propheti
27.09.2006, 14:17:30
Bo zamiast wpisywania trzech cyferek przy przelewaniu kasy, wpisuje 6-7. Kolejna rzecz, to że ludzie z reguły wolą mieć mniejsze id, ze względu na fakt, że im mniejsze tym wyżej są na liście obecnych.
Mar3k
27.09.2006, 14:50:27
Może dodatkowe pole w bazie i nadanie im numerow od 1 do ilosci userow ?
Zniknie problem ale przybedzie pole .
AxZx
27.09.2006, 16:37:01
Cytat(propheti @ 27.09.2006, 13:17:30 )

Bo zamiast wpisywania trzech cyferek przy przelewaniu kasy, wpisuje 6-7. Kolejna rzecz, to że ludzie z reguły wolą mieć mniejsze id, ze względu na fakt, że im mniejsze tym wyżej są na liście obecnych.
chcesz powiedziec ze jezeli ktos nowy sie zapisze i zalozmy bedzie mial to mniejsze ID bo trafi mu sie dziura (np ID 29 sie zwolni) to bedzie wyzej w hierarchi?
o masz zly sposob hierarchizowania;)
a pozatym niech gracz nie bedzie numerkiem, tylko zeby mial swoj login i jak chcesz dac mu mozliwosc robienia przelewu totak zeby nie musial pamuietac jaki to byl login, albo jakie to bylo ID tylko zrob mu liste userow niech sobie znajdzie i kliknie.
propheti
27.09.2006, 18:03:15
Eh, chyba jasno powiedziałem czego potrzebuje prawda?

Gdybym mógł brać pod uwage inne rozwiązania, to pewnie bym się tak nie męczył.
Zależy mi na skrypcie który sprawdzi tabele w poszukiwaniu "dziur" i przy dodawaniu nowego wiersza, najnormalniej załata nim jedną z tych luk.
Moge liczyć na pomoc?
A propo, AxZx - sprawdź sam, dlaczego nie moge zrobić inaczej -
http://abbil.cal.pl
nexis
27.09.2006, 18:50:49
Są dwa sposoby:
1) Podczas usuwania konto (czyli zwolnieniu się ID) dopisujesz to ID do specjalnej tabeli, z której podczas rejestracji jest ewentualnie brane ID, a jeśli tabela jest pusta to użytkownik dostaje po prostu MAX(id)
2) Robisz pęltę i sprawdzasz po kolei czy dane id jest zajęte
<?php
$i = 1;
$query = 'SELECT id FROM users ORDER BY id ASC';
if ($row['id'] != $i) {
$userid = $row['id'];
}
$i++;
}
?>
sticker
27.09.2006, 18:52:29
jak tak będziesz łatać dziurki a używasz mysql bez transakcji to może Cie spotkać bardzo przykra niespodzianka i w bazie zrobi Ci sie niezły bałagan chyba że dobrze to kontrolujesz.
A co do skryptu który będzie to sprawdzał to po prostu przelatuj kolejne cyferki z tabelki od 1 w góre i szukaj pierwszej wolnej.
propheti
28.09.2006, 14:24:00
Huh, no i pojawił się problem.

Kod
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/prophet/domains/abbil.cal.pl/public_html/test.php on line 8
linia 8 to:
Kod
while (($row = mysql_fetch_array( $query )) && (!isset( $userid ))) {
SongoQ
28.09.2006, 14:33:00
Kiedys pisalem na forum jak za pomoca 1 zapytania zwrocic najmniejszy wolny numer. Wystarczy poszukac jak Cie to tak bardzo interesuje. Jesli nie znajdziesz to pisz to powtorze to jeszcze raz.
propheti
28.09.2006, 14:46:11
Ja na szczęście należe do nielicznej grupy osób, które potrafią korzystać z wyszukiwarek. Jednak znalezienie tego jednego posta wśród tysięcy tematów jest niczym poszukiwanie igły w stogu siana, a ja już i tak spędziłem sporo czasu na poszukiwaniu odpowiedzi na nurtujące mnie pytanie.
Więc byłbym wyjątkowo wdzięczny jeśli mógłyś powtórzyć.
SongoQ
28.09.2006, 20:55:14
Ok wiec najprosciej jest zrobic cos takiego.
Mamy tabele tabela
pole id
1
2
4
5
7
10
Najmniejszym wolny id jest 3
SELECT t1.id + 1
FROM tabela t1 LEFT JOIN tabela t2 ON t1.id = t2.id + 1
WHERE t2.id IS NULL
LIMIT 1
Problem jest jesli nie ma pierwszego id czyli 1. Mam nadzieje ze CI to jakos zobrazowalo jak wyciagnac najmniejsze wolne id.
propheti
28.09.2006, 23:55:31
Niestety, ale powyższe zapytanie nie działa, zawsze przy wykonywaniu wywala wynik
2.
Możliwe że robie coś źle...
Ehh, już mnie zaczyna głowa od tego boleć.
SongoQ
29.09.2006, 09:01:21
Podaj strukture i kilka przykladowych danych i zapytanie jakie wykonujesz.
propheti
29.09.2006, 12:34:38
Struktura tabeli
players:
id | user | pass | rank | ...
-----
1 | jurek | (md5) | admin | ...
2 | czesuaf | (md5) | member | ...
4 | wacuaf | (md5) | staff | ...
A oto zapytanie:
SELECT t1.id + 1
FROM players t1 LEFT JOIN players t2 ON t1.id = t2.id + 1
WHERE t2.id IS NULL
LIMIT 1
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.