Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wybieranie liczb z podanego zakresu.
f1x
post 12.03.2010, 15:55:40
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 27.07.2008

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


Witam,
posiadam taki oto problem:

Mam tabele characters, która przechowuje postacie pewnej gry. Tabela ma mniej-więcej takie pola:

order,
account_id,
name

itd.

Każde konto może posiadać maksymalnie pięć postaci. Powiedzmy, że mam przykładowe dane typu:

Kod
order | account_id | name
1    |    f1x    |    test
2    |    f1x    |    test2
3    |    f1x    |    test3
4    |    f1x    |    test4
5    |    f1x    |    test5


I teraz powiedzmy, że usuwam drugi i trzeci rekord. Zostaje mi:
Kod
order | account_id | name
1    |    f1x    |    test
4    |    f1x    |    test4
5    |    f1x    |    test5


Teraz chciałbym dodać 1 rekord i tutaj zaczyna się mój problem. W jaki sposób skonstruować zapytanie, aby nowo dodany rekord w kolumnie Order miał pierwszą wolną liczbę całkowitą z przedziału liczbowego <1, 5>. Po dodaniu rekordu dane miałyby wyglądać tak:

Kod
order | account_id | name
1    |    f1x    |    test
2    |    f1x    |    NOWY
4    |    f1x    |    test4
5    |    f1x    |    test5


Jedyne, co przychodzi mi do głowy, to stworzyć procedurę składowaną, która będzie pobierała SELECT COUNT(*) FROM characters WHERE account_id = f1x AND order = 1 - i tak dalej, aż do order równego 5, i gdzie COUNT == 0, to zwrócić order. Ale jest to raczej niewydajne winksmiley.jpg. Niestety nie znam się kompletnie na zaawansowanym MySQL. Bardzo proszę i z góry dziękuje za pomoc!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
Mchl
post 12.03.2010, 19:11:59
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

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


Ja bym kombinował tak:
Kod
CREATE TEMPORARY TABLE temp_orderNos (
  order TINYINT
) ENGINE = MEMORY;

INSERT INTO temp_orderNos VALUES (1),(2),(3),(4),(5);

SELECT
  t.order
FROM
  temp_orderNos AS t
LEFT JOIN
  characters AS c  
ON
  c.order = t.order
WHERE
  c.account_id = ?
  AND c.order IS NULL
ORDER  BY
  t.order ASC
LIMIT 1;

DROP TEMPORARY TABLE temp_orderNos;
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 Wersja Lo-Fi Aktualny czas: 19.07.2025 - 10:00