←  Pluginy

AMXX.pl: Support AMX Mod X i SourceMod

»

Czyszczenie zbędnych rekordów [SQL]

Zablokowany

  • +
  • -
DB - zdjęcie DB 15.08.2009

Chciałem wyczyścić tabelę diablo z osób, które nie grają (exp mniej niż np 100). Napisałem takie zapytanie sql ale coś nie hula - może ktoś poprawić ? Bo nie wiem w czym błąd.

delete * from `dbmod_tablet` where sid != (

  select * FROM `dbmod_tablet` WHERE sid = (
    SELECT sid FROM `dbmod_tablet` WHERE exp>100
  )
)
Odpowiedz

  • +
  • -
Portek - zdjęcie Portek 15.08.2009

DELETE * FROM `dbmod_tablet` WHERE exp < 100;
Odpowiedz

  • +
  • -
DB - zdjęcie DB 15.08.2009

Chodzi ci o odstęp czy o znak ? Bo jeśli o znak to trochę w twoim przypadku nie ma to sensu.

drugie podzapytanie wyciąga rekordy z większym expem niż 100, pierwsze podzapytanie wyciąga te z mniejszą niż 100.
A główne usuwa pozostałe - czyli te w których wszystkie rekordy z pola exp dla danego sid mają wartość mniejszą niż 100
Odpowiedz

  • +
  • -
Portek - zdjęcie Portek 15.08.2009

drugie podzapytanie wyciąga rekordy z większym expem niż 100, pierwsze podzapytanie wyciąga te z mniejszą niż 100.
A główne usuwa pozostałe - czyli te w których wszystkie rekordy z pola exp dla danego sid mają wartość mniejszą niż 100

A po co się w to bawić?

Chodzi ci o odstęp czy o znak ? Bo jeśli o znak to trochę w twoim przypadku nie ma to sensu.

I o to i o to. W twoim przypadku zostaną skasowane rekordy które w tabeli mają exp powyżej 100 (a chodziło chyba o coś innego).

Moje zapytanie samo wybierze sobie rekordy z bazy i usunie je jeśli w tabeli exp będzie wynosił poniżej 100.
Odpowiedz

  • +
  • -
DB - zdjęcie DB 15.08.2009

No nie zgodzę się. Zadniem jest wyszukanie tych rekordów których nie chcemy usunąć (albo inaczej usunąć te które określonych później warunków nie spełniają - więc to co napisałeś nie ma sensu.) Podzapytania mają mają wykluczyć usunięcie graczy którzy przynajmniej w jednej z 8 klas mają expa większego niż 100.
Od końca zatem: podzapytanie 2 wybiera rekordy które mają większego expa niż 100, a pierwsze podzapytanie wyłącza pozostałe dla tego sid niezależnie od tego ile mają expa.
Następnie wszystkie które tych warunków nie spełniają są usuwane (czyli te które mają 8 klas z expem mniejszym niż 100)


Moje zapytanie samo wybierze sobie rekordy z bazy i usunie je jeśli w tabeli exp będzie wynosił poniżej 100.

Czyli jak ktoś ma na jednej postci 500 000 expa a na pozostałych nic to wywali mu wsystkie inne rekordy i zostawi tylko ten (tą postać) i nie będzie mógł expić bo plugin już ich nie stworzy - nie o to mi chodzi.

Ma być tak że jeśli jedna z 8 klas ma więcej niż 100 to wszystkie 8 rekordów dla tego sid zostaje
Odpowiedz

  • +
  • -
Portek - zdjęcie Portek 16.08.2009

Czyli jak ktoś ma na jednej postci 500 000 expa a na pozostałych nic to wywali mu wsystkie inne rekordy i zostawi tylko ten (tą postać) i nie będzie mógł expić bo plugin już ich nie stworzy - nie o to mi chodzi.

Ma być tak że jeśli jedna z 8 klas ma więcej niż 100 to wszystkie 8 rekordów dla tego sid zostaje

No tak o tym nie pomyślałem, w php może być? ;P Jeśli chodzi o PAWNA, nie czuje się na siłach, w php coś wymodzę.
Odpowiedz

  • +
  • -
DB - zdjęcie DB 16.08.2009

może być w czymkolwiek :)

Ja wymyśliłem takie zapytanie sql - chyba tak to najprościej nalezy zrobić ale nie wiem czemu nie działa - może ktoś zna się na tym lepiej i mnie poprawi.
Odpowiedz

Seba - zdjęcie Seba 18.08.2009

Nie czaje czemu nie podoba Ci się zapytanie podane przez @portek - napisz, co dokładnie ma się stać i co zapytanie zwrócić.
Odpowiedz

  • +
  • -
DB - zdjęcie DB 18.08.2009

Przecież napisałem dlaczego jest ono złe

Czyli jak ktoś ma na jednej postci 500 000 expa a na pozostałych nic to wywali mu wsystkie inne rekordy i zostawi tylko ten (tą postać) i nie będzie mógł expić innych postaci bo plugin już ich nie stworzy


i napisałem co potrzebuję.

Ma być tak że jeśli jedna z 8 klas ma więcej niż 100 to wszystkie 8 rekordów dla tego sid zostaje

Odpowiedz

Seba - zdjęcie Seba 19.08.2009

Podaj tylko strukturę bazy.
Odpowiedz

  • +
  • -
DB - zdjęcie DB 19.08.2009

Wystarczy ci screen ?

Załączone miniatury

  • baza.PNG
Odpowiedz

Seba - zdjęcie Seba 20.08.2009

Ale zaraz, w której komórce trzymany jest exp poza "exp" ? Bo nie rozumiem nadal.

Bo nadal jak patrze na ten pierwszy post, to zapytanie Portka pasuje.
Odpowiedz

  • +
  • -
DB - zdjęcie DB 20.08.2009

Każdy gracz tworzy 8 rekordów przy pierwszym podłączeniu do serwera dla które różnią się tylko `klasa` = {1,2,3,4,5,6,7,8}. Chodzi o to, że jeśli ktoś expi jedną postać to jedynie jedna z nich będzie miała przykładowo exp = 100000 a reszta klas dla tego sid dalej będzie miała exp 0. Chodzi o to aby zapytanie sprawdziło czy którakolwiek klasa ma expa większego od 100 i jeśli żadna z nich nie będzie miała exp>100 to usunie wszystkie 8 rekordów z danym sidem.

Uf...

Chcę jedynie wtedy usunąć rekordy dla `exp` <100 gdy ani jedna z 8 klas nie będzie miała expa więcej niż 100
Zapytania portka jest złe ponieważ jeśli ktoś będzie miał np na jednej klasie expa większego a na reszcie mniejsze niż 100 to usunie mu pozostałe klasy poza jedną - efekt będzie taki że nie możliwe będzie już expienie na pozostałych postaciach które zostały usunięte bo plugin nie odtworzy struktury bo dany sid już jest w bazie - co prawda tylko dla jednej klasy ale jest
Odpowiedz

Seba - zdjęcie Seba 20.08.2009

Aa... czyli steamid nie jest unique key'em w bazie.
Odpowiedz

  • +
  • -
DB - zdjęcie DB 20.08.2009

Screen poniżej przedstawia sytuację w której wszystkie rekordy z danym sidem chcemy usunąć
http://i32.tinypic.com/2n00al4.png

A ten sytuację kiedy WSZYSTKIE mają zostać w bazie
http://i29.tinypic.com/34zby8l.png


Dlatego właśnie skorzystałem z tych podzapytań - drugie wyłącza z funkcji delete wszystkie które mają przynajmniej jedną klasę z większym expem a pierwsze dokłada do "wyłączonych" pozostałe rekordy (te z mniejszym expem od 100) dla tego SID tak aby "pełny zestaw" gracza pozostał w bazie.
Odpowiedz

  • +
  • -
Miczu - zdjęcie Miczu 20.08.2009

SELECT `nick`, MAX(`lvl`) FROM dbmod_tablet  GROUP BY `nick`

O ile sie nie myle, to wypisze wszystkie sid, z ich najwiekszym lvl'em.

Przejechac po tych ponizej oczekiwan z deleta i powinno byc ok.
Odpowiedz
Zablokowany