Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pomoc w utworzeniu zapytania
Forum PHP.pl > Forum > Bazy danych
foxbond
Kod
|------
|playerItemId|itemId|playerId|playerItemBag|playerItemPlace|playerItemStack
|------
|1|1|1|1|16|1
|2|2|1|1|35|1
|3|3|1|1|32|1
|4|2|1|2|1|1
|5|3|1|3|9|1
|6|1|1|2|8|1
|7|1|1|2|14|1
|8|3|1|1|1|1
|9|3|1|2|10|1
|11|1|1|1|9|1
|12|1|1|1|0|1
|13|1|1|1|4|1

Zakres playerItemPlace 0-47


Chcę się dowiedzieć jaka jest najmniejsza wolna wartość playerItemPlace dla danego playerItemBag

Czyli dla playerItemBag=1 jest to 2, dla playerItemBag=2 i playerItemBag=3 jest to 0





Tu jest obrazek bo słabo widac na tekstowym przykładzie:

daniel1302
Jeśli pobierasz dla konkretnego ID to:
  1. SELECT min(playerItemPlace) AS playerItemPlace FROM tabela WHERE playerItemBag=JAKIES_ID


A jeśli minimalne wartości dla wszystkich ID to:
  1. SELECT min(playerItemPlace) AS playerItemPlace FROM tabela GROUP BY playerItemBag
foxbond
No tak, ale mi chodzi jakie jest najmniejsze playerItemPlace dla danego playerItemBag które nie jest zajęte


EDIT:
Twój przykład jest dobry do momentu gdzie najniższe zajęte playerItemPlace jest większe/równe 1. Wtedy najniższym wolnym playerItemPlace będzie (wynik twojego zapytania)-1. Jednakże gdy obecnie najniższym zajętym miejscem jest 0 (a powiedzmy wszystkie inne wolne) twoje zapytanie nie będzie działać.


Nawet nie wiem jak to zrobić po stronie php, gdybym miał to z bazy pobrane do zmiennej...
daniel1302
Nie rozumię wogóle co chcesz zrobić.
Cytat
Chcę się dowiedzieć jaka jest najmniejsza wolna wartość playerItemPlace dla danego playerItemBag

Czyli dla playerItemBag=1 jest to 2, dla playerItemBag=2 i playerItemBag=3 jest to 0


Kolumna playerItemPlace dla playerItemBag=2 przyjmuje wartości: 16,35,32,1,0,9,4

Co wogóle rozumiesz przez słowa "nie zajęte" bo mi wolne kojarzy się z wartością ID=null,

A tak ty możesz mieć wartość 0xff albo 1, więc pierw poczytaj na temat: "Jak mądrze zadać pytanie"
foxbond





Potrzebuję najmniejszej wartości z zakresu 0-47 która nie jest zajęta
Dla pierwszego powinno zwrócić 2
Dla drugiego: 0
Dla trzeciego: 2
sazian
na pewno na te same dane patrzymy ?
ja widzę
dla playerItemBag=1 jest 0 (nie 2)
dla playerItemBag=2 jest 1 (nie 0)
dla playerItemBag=3 jest 0 (nie 2)

najpierw wytłumacz jak ty te wartości wyznaczasz
foxbond
Potrzebuję najmniejszej wartości z zakresu 0-47 która nie jest zajęta
dla playerItemBag=1 najmniejsza zajęta jest 0, najmniejsza niezajęta jest 2
dla playerItemBag=2 najmniejsza zajęta jest 1, najmniejsza niezajęta jest 0
dla playerItemBag=3 najmniejsza zajęta jest 0, najmniejsza niezajęta jest 2

No jeśli nadal nie wiadomo co co chodzi to może na obrazku pokazać?
sazian
a skąd wiadomo że jest zajęta ?
foxbond
Pola zajęte to te wpisane w bazę, czyli:
dla playerItemBag=1
[0,1,4,9,16,32,35]
dla playerItemBag=2
[1,8,10,14]
dla playerItemBag=3
[0,1,9]
sazian
dobra już się domyśliłem o co chodzi
jak to zrobić w czystym sql nie wiem ale za to można w połączeniu z php
  1.  
  2. $id=SELECT GROUP_CONCAT(playerItemPlace SEPARATOR ',') ids FROM ....
  3.  
  4. var_dump(min(array_diff(range(0,47),explode(',',$id))));
  5.  
foxbond
Można to zrobić tak:
  1.  
  2. for ($i=0;$i<47;$i++){
  3. $q = query("SELECT COUNT(*) FROM playerItems WHERE playerItemBag=1 AND playerID=1 AND playerItemPlace=".$i);
  4. if ($q == 0){
  5. $min = $i;
  6. break;
  7. }
  8.  
  9. }


Jednak to wykona 48 razy zapytanie do bazy....

EDIT:
zaraz wypróbuję twój sposób, dzięki za próbę pomocy

EDIT:
WIELKIE dzięki, działa wyśmienicie

EDIT:
A jednak w niektórych wypadkach jest błąd. Nie wiem dlaczego, możliwe, że błąd jest w innym miejscu.
Qualt
Jak na moje oko, to nie da rady sprawdzić, które miejsce jest wolne, skoro nie istnieje w bazie taki zapis. Nie lepiej byłoby dla każdego Baga dodać wszystkie miejsca i później sprawdzać gdzie jest pusto?
Żeby sprawdzić w bazie czy coś jest puste, dany rekord musi istnieć. Możesz też ewentualnie połączyć to z php.
  1. SELECT playerItemPlace, playerItem FROM ... WHERE playerItemBag = ... ORDER BY playerItemPlace;

Przetwarzasz sobie dane, żeby mieć tablicę w postaci ( playerItemPlace => playerItemStack lub po prostu pusta wartość )
  1. if(!empty($results)){
  2. $i=0;
  3. while(isset($results[$i]) AND $i <= 47){
  4. echo $i;
  5. ++$i;
  6. }
  7. if($i==48)
  8. echo 'wszystkie zajete';
  9. else
  10. echo 'pierwszy pusty: '.$i;
  11. }
sazian
a w jakim przypadku ?
foxbond
@Qualt
Nie mogę dla każdego baga dać wszystkich pól, gdyż momentalnie baza rozrosła by się o (48*3+10)*liczba_graczy
Dodatkowo gracze raczej częściej będą mieli te plecaki puste niż zapełnione, tak więc tworzy się ogromną ilość niepotrzebnych rekordów.

Zrobiłem jakieś logi na szybko, wyszło, że błąd był gdy zamieniałem przedmioty miejscami. Wystarczyło zamienić kolejność if-ów i jest w porządku.


Sposób @sazian-a jest jak najbardziej poprawny, przypomniały mi się operacje na zbiorach ze szkoły średniej tongue.gif
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.