![]() |
![]() |
![]()
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 ![]() |
|
|
![]() |
![]()
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; |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 10:00 |