Dobra przymierzalem sie do tego poradnika od jakiegos czasu juz wiec go napisze. Z pewnoscia osoby ktore chca sie czegos fajnego nauczyc z niego skorzystaja. Dodam tylko ze 100% wiedzy ktora tu dostaniecie ja musialem wygrzebywac standardowo z dokumentacji do ktorej wiekszosc osob nie raczy zajrzec a ktora zawiera ciekawe elementy. Moze czesc zna juz niektore zagadnienia a moze niektorych to troszke oswieci. Moze ktos zobaczy jakas fajna alternatywe dla siebie a moze nic ciekawego.

1. SELECT z wielu tabel z pominieciem JOINOW

Jesli chcemy wybrac jakis rekord z pola users (czyli standardowa operacja czesto) a do tego chcielibysmy pobrac statystyki tego usera to mozemy to zrobic w jednym zapytaniu bez JOINOW a z uzyciem jedynie SELECT
Kod:
SELECT * FROM users WHERE id=$nasze_id;
SELECT * FROM stats WHERE id=$nasze_id;
mozna zastapic z powodzeniem przez 1 zapytanie:
[/code]
SELECT * FROM users, stats WHERE users.id=stats.id AND users.id=$nasze_id;
[/code]
To zapytanie spowoduje ze wybrane wyniki zostana automatycznie polaczone. Zaleta tego jest prostota i przejrzystosc. Wada jest to ze warunek users.id=stats.id musi istniec wiec musza istniec statystyi dla naszego usera. Jednak w przypadku gdy po prostu rozbijamy rzeczy na wiele tabel te dane bardzo czesto istnieja poniewaz sa nam i tak niezbedne.

2. UPDATE na wielu tabelach

No i tutaj jest BAAARDZO ciekawa kwestia polecenia UPDATE. Ile razy tworzylismy 2 zapytania ktore updatowaly po tym samym warunku? No wlasnie... Mozna to zrobic w jednym zapytaniu. Dziala calosc podobnie jak w przypadku SELECT ale rozni sie tym ze aktualizuje rekordy a nie je wybiera.
Przykladowo jesli chcemy kazdemu graczowi w naszej grze dodac do swoich pieniedzy % kasy (podzielonej pomiedzy czlonkow) ktora zarobil dzis jego gang mozemy to zrobic jednym prostym zapytaniem. Pozostaje jeszcze tylko wyzerowanie gangom ich funduszy drugim prostym zapytaniem i gotowe. Czyz to nie piekne?
Kod:
UPDATE users, gangi SET users.kasa+=round(gangi.kasa/gangi.liczba_czlonkow) WHERE users.gang_id=gangi.id AND users.gang_id!=0;
Patrzcie jakie to proste bylo. Nie musimy uzywac do tego php. Od teraz recznie mozemy w phpmyadmin tworzyc na szybko zapytania ktore pozwola nam zmieniac cala strukture gry. W ten sposob mozemy zdzialac bardzo wiele rzeczy. Wystarczy jedynie znac strukture bazy danych i nie miec dublowanych danych poniewaz wtedy musimy robic UPDATE z ta sama wartoscia na 2 lub wiecej tabel co jest niewygodne. Nawet jakbysmy mieli 10 tabel polaczonych jednym kluczem, lub roznymi kluczami ze soba to mozemy wszystko ladnie zawrzec w warunku WHERE poprzez przykladowo:
Kod:
WHERE table1.table2_id=table2.id AND table2.table3_id=table3.id ...itd
Pozwoli nam to POLACZYC wszystkie warunki i uzyskac jedna wiekla mase do UPDATE ktora bedzie sie ladnie aktualizowala. Prostota jest wiekla!!!

3. INSERT ... SELECT

Bardzo przydatna sztuczka. Dziala podobnie jak UPDATE ale ma jeszcze jedna wielka zalete. Co prawda mozna tworzyc INSERT tylko do jednej tabeli na raz ale za to mozna w bardzo prosty sposob tworzyc w ten sposob archiwa lub po prostu duplikowac klucze ktore nam sie przydaja w naszym pozniejszym przeszukiwaniu tabel. Zalozmy przykladowo ze gracz kupuje miecz od kupca. Wiec tutaj tworzymy zapytanie INSERT ktore bedzie nam kopiowalo item do jego plecaka a ponadto sprawdzi od razu czy gracz mial wystarczajaca ilosc pieniedzy. Zobaczcie ile dzialan dzieje sie w jednym zapytaniu
Kod:
INSERT INTO plecak (atak,obrona,wytrzymalosc) SELECT sklep.atak,sklep.obrona,sklepwytrzymalosc FROM sklep, gracz WHERE sklep.id_przedmiotu=$id AND sklep.cena<=gracz.pieniadze LIMIT 1;
Pozniej wystarczy sprawdzic jedynie poprzez mysql_affected_rows czy funkcja zwraca wartosc 1. Jesli tak to znaczy ze gracz dostal swoj item do plecaka i wystarczy juz tylko zrobic UPDATE z nasza piekna polaczona sztuczka ktory odejmie graczowi stosowna ilosc pieniedzy

---------------------------------------------------------------------------------

To na razie tyle. Mysle ze sie komus ten poradnik przydal i ktos nauczyl sie jakichs pozytecznych funkcji mysql. Wszystkie kody pisalem z palca wiec moze byc jakis uszczerbek na jakosci. Modow prosze o poprawienie ewentualnych razacych bledow w pisowni jesil takie znajda bo bardziej sie skupialem na innych zagadnieniach . No i oczywiscie w przyszlosci chce widziec same ciekawsze zapytania niz ciagle SELECTY lub UPDATE w petli.

Poradnik stworzony zostal dla mmocenter.pl i jest moja wlasnoscia. Zabrania sie besposredniego kopiowania go na strony. Tresc ma byc ogolnodostepna bez stosowania dodatkowych oplat poniewaz wszelkie prawa majatkowe jakowe istnieja w tym wypadku naleza do mnie