Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Czyszczenie zbędnych rekordów [SQL]


  • Zamknięty Temat jest zamknięty
15 odpowiedzi w tym temacie

#1 DB

    Wszechwidzący

  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 15.08.2009 13:34

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
  )
)

  • +
  • -
  • 0

#2 Portek

    Kończymy zabawę, permanentna emerytura!

  • Przyjaciel

Reputacja: 976
Master

  • Postów:3 007
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Częstochowa
Offline

Napisano 15.08.2009 13:46

DELETE * FROM `dbmod_tablet` WHERE exp < 100;

  • +
  • -
  • 0

serwer-1.png
IP: ts3.cserwerek.pl


#3 DB

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 15.08.2009 14:48

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
  • +
  • -
  • 0

#4 Portek

    Kończymy zabawę, permanentna emerytura!

  • Przyjaciel

Reputacja: 976
Master

  • Postów:3 007
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Częstochowa
Offline

Napisano 15.08.2009 15:22

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.
  • +
  • -
  • 0

serwer-1.png
IP: ts3.cserwerek.pl


#5 DB

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 15.08.2009 19:11

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
  • +
  • -
  • 0

#6 Portek

    Kończymy zabawę, permanentna emerytura!

  • Przyjaciel

Reputacja: 976
Master

  • Postów:3 007
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Częstochowa
Offline

Napisano 16.08.2009 15:26

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ę.
  • +
  • -
  • 0

serwer-1.png
IP: ts3.cserwerek.pl


#7 DB

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 16.08.2009 16:46

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.
  • +
  • -
  • 0

#8 Seba

    Wszechobecny

  • Zbanowany

Reputacja: 198
Profesjonalista

  • Postów:424
  • Lokalizacja:Internet
Offline

Napisano 18.08.2009 06:57

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

#9 DB

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 18.08.2009 09:32

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


  • +
  • -
  • 0

#10 Seba

    Wszechobecny

  • Zbanowany

Reputacja: 198
Profesjonalista

  • Postów:424
  • Lokalizacja:Internet
Offline

Napisano 19.08.2009 14:36

Podaj tylko strukturę bazy.

#11 DB

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 19.08.2009 18:03

Wystarczy ci screen ?

Załączone miniatury

  • baza.PNG

  • +
  • -
  • 0

#12 Seba

    Wszechobecny

  • Zbanowany

Reputacja: 198
Profesjonalista

  • Postów:424
  • Lokalizacja:Internet
Offline

Napisano 20.08.2009 13:25

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.

#13 DB

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 20.08.2009 19:50

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
  • +
  • -
  • 0

#14 Seba

    Wszechobecny

  • Zbanowany

Reputacja: 198
Profesjonalista

  • Postów:424
  • Lokalizacja:Internet
Offline

Napisano 20.08.2009 19:54

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

#15 DB

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 19
Początkujący

  • Postów:230
Offline

Napisano 20.08.2009 20:03

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.
  • +
  • -
  • 0

#16 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 20.08.2009 22:41

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.
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych