-
Üdv!
Azt szeretném megoldani, hogy van két tábla. Mindkét táblába más adatokat tárolunk de a két táblában azonos, hogy minden sornak van egy párja a másik táblában. Konkrétan mind a két táblában a sorok játékosokat jelölnek. Azért kell két külön tábla, mert az egyik táblának az oszlopai dinamikusak ezért egyszerûbb, ha külön táblában vannak.
A gond csak az, hogy szeretném egy query ben lekérdezni az adatokat Belépéskor, mert úgy jóval egyszerûbb lenne az új pluginban a THREAD-ok miatt.
Szóval.
Adott két tábla:
Players: adat1|adat2|adat3
Players2: adatA|AdatB|AdatC|AdatD|AdatE
Úgy szeretném ennek a két táblának az adatait lekérni, hogy a cache_get_row nál 0. sorba a Players táblába levö adatokat adja 1. sorba pedig a Players2 adatait.
Ez azért szükséges, mert a Players2 adatait ciklussal kell PV arokba tölteni, mivel nincs meghatározva, hogy konkrétan hány oszlop is van az adott sorban.
Én arra gyanakszom, hogy a JOIN függvényre lesz szükségem, de ennek használatában még eléggé tapasztalatlan vagyok.
Remélem érthetõen fogalmaztam :D
-
Ha külön sorba akarod, akk UNION. A JOIN egy sorban adja vissza az értékeket.
-
Viszont azzal az a probléma, hogy nem egyeznek meg az oszlopok számai
Dupla hozzászólás automatikusan összefûzve. ( 2012. július 18. - 14:30:02 )
de végülis nem olyan fontos hogy külön sorba legyenek, lehet a ciklust inditani akármiylen számról
-
Ha JOIN-oli akarsz kettõ táblát, elõször is szükséged lesz a 2 táblában azonos értéket tartalmazó mezõk neveire.
Íme egy JOIN-os lekérdezésre példa:
Tegyük fel van 2 táblánk. Elsõben a jármûveink adataid tároljuk:(model ID, szín, koordináták)
Tábla neve: kocsi
Tábla mezõi: id(Auto Increment), modellid, szin, xcoord, ycoord, zcoord
Másodikban pedig a jármû modellek adatait tároljuk, amiket használunk a szerveren(Név, Ár)
Tábla neve: modellista
Tábla mezõi: id(Auto Increment), modellid, nev, ar
A JOIN-nak 3 fajtája van, INNER(kereszttáblás), LEFT és RIGHT. Neked most itt igazából mindegy melyiket használod, szóval maradjunk az INNER-nél, ha gondolod elmagyarázhatom mi a különbség a fajta között.
A JOIN-t a FROM után kell használnunk. A FROM-nál megadjuk az elsõ táblánk nevét, majd JOIN szócska után a 2. tábla nevét, amit hozzá akarunk kapcsolni. Ha Nincs a JOIN után ON \"rész\", akkor minden táblát összepárosít magának. Mi viszont nem ezt szeretnénk, ezért az ON szócska után egy zárójelben megadjuk hogy a 2 tábla mely 2 mezõjét akarjuk összekapcsolni. Az összekapcsolást az =-el tehetjük meg.
Térjünk vissza a példánkhoz. Én le akarom kérni a2-es \'id\'-jû jármû néhány adatát. Konkrétan a \'kocsi\' tábla \'szin\' mezõjét, valamint meg akarom tudni, hogy ennek a jármûnek a modelljének mi a neve, valamint hogy mennyi az ára. Tehát le kell kérnünk a \'modellista\' tábla \'ar\' és \'nev\' mezõjét. Az összekapcsolás a 2 tábla között a \'kocsi\' tábla \'modellid\' mezõje, és a \'modellista\' tábla \'modellid\' mezõje között fog zajlani. Így néz ki tehát a lekérdezésünk:
SELECT \'kocsi\'.\'szin\', \'modellista\'.\'ar\', \'modellista\'.\'nev\' FROM \'kocsi\' INNER JOIN \'modellista\' ON (\'kocsi\'.\'modellid\' = \'modellista\'.\'modellid\') WHERE \'kocsi\'.\'id\' = 2
Ezzel eredményül megkapjuk a kocsi színét, valamint a nevét(pl. Sultan), és hogy mennyibe kerül.
Próbáltam nagyon egyszerû példát mondani, és nem szakszavakat használni, ha valahol elakadsz szólj, és segítek :)
-
Értem tökéletesen leírtad köszönöm szépen :)
Esetleg ha nem nagy kérés elmagyaráznád a három féle JOIN között a különbségeket meg hog ymelyiket milyen helyzetekben alkalmaznak? Ez már csak puszta kiváncsiság :D
Dupla hozzászólás automatikusan összefûzve. ( 2012. július 18. - 21:44:55 )
Még annyit kérhetnék, hogy leellenörizd, hogy ebben mi lehet a hiba?
format(query, sizeof(query), \"SELECT * FROM \'Players\' INNER JOIN \'Players2\' ON (\'Players\'.\'Name\' = \'Players2\'.\'Name\') WHERE \'Players\'.\'Name\' LIKE \'%s\' AND \'Players\'.\'IP\' LIKE \'%s\'\", Name(playerid), IP);
Errorid:1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'.\'RegID\' FROM \'Players\' INNER JOIN \'KihivasokRekordok\' ON (\'Players\'.\'Name\' = \'P\' at line 1
-
Az elõzõ példát folytatva fogom megmutatni, mert úgy egybõl érthetõ lesz a dolog. Ehhez azonban adatok is kelleni fognak, hogy látszódjon mirõl beszélek. Tegyük fel hogy a \'kocsi\' táblában van 3 sorunk:
id
| modellid
| szin
| xcoord
| ycoord
| zcoord
|
1
| 522
| 1
| 1000
| 1000
| 1000
|
2
| 520
| 2
| 1005
| 1005
| 1005
|
3
| 411
| 3
| 1010
| 1010
| 1010
|
[/quote]
A modellista táblában pedig 4:
id
| modellid
| nev
| ar
|
1
| 411
| Infernus
| 200000
|
2
| 400
| Landstalker
| 70000
|
3
| 520
| Sultan
| 150000
|
4
| 556
| Monster \"A\"
| 1000000
|
[/quote]
Ezen a 2 táblán fogom most bemutatni a 3 fajta JOINt.
A) INNER JOIN:
Ezzel a táblakapcsolási típussal csak olyan sort kapunk eredményül, ahol mind a 2 táblában van adat. Ha valamelyik tábla egyik cellájában nincs adat, akkor azt a sort nem fogjuk megkapni. Nézzük meg mit kapunk, ha INNER JOIN-al kapcsoljuk a két táblát, és lekérünk minden adatot:
SELECT * FROM `modellista` JOIN `kocsi` ON ( `kocsi`.`modellid` = `modellista`.`modellid` )
Szándékosan nem INNER JOIN-t írtam, hanem csak JOIN-t. Ha nem írjuk elé hogy INNER, akkor a legtöbb SQL rendszer tudni fogja hogy mi az INNER JOIN-ra gondoltunk, de azért sokkal szebb, és szabályosabb ha odaírjuk. Szóval tessék odaírni, ezt most csak érdekességképp mutattam.
A következõ eredményt kapjuk:
id
| modellid
| nev
| ar
| id
| modellid
| szin
| xcoord
| ycoord
| zcoord
|
1
| 411
| Infernus
| 200000
| 3
| 411
| 3
| 1010
| 1010
| 1010
|
3
| 520
| Sultan
| 150000
| 2
| 520
| 2
| 1005
| 1005
| 1005
|
[/quote]
Nem meglepõ, hisz csak ennél a 2 modellidnél(411, 520) volt adat mind a kettõ táblában.
B) LEFT JOIN:
Ezzel a kapcsolási típussal a lekérdezésünk a bal oldali táblából minden adatot megjelenít, akkor is, ha nincs párja a jobb oldali táblában. Amennyiben nincs párja, a második tábla értékei mind NULL karakterek lesznek.
Tehát lekérdezünk:
SELECT * FROM `modellista` LEFT JOIN `kocsi` ON ( `kocsi`.`modellid` = `modellista`.`modellid` )
Mind láthatjuk a kód ugyanúgy épül fel, az egyetlen különbség a LEFT szócska a JOIN elõtt. Nézzük az eredményt:
id
| modellid
| nev
| ar
| id
| modellid
| szin
| xcoord
| ycoord
| zcoord
|
1
| 411
| Infernus
| 200000
| 3
| 411
| 3
| 1010
| 1010
| 1010
|
2
| 400
| Landstalker
| 70000
| NULL
| NULL
| NULL
| NULL
| NULL
| NULL
|
3
| 520
| Sultan
| 150000
| 2
| 520
| 2
| 1005
| 1005
| 1005
|
4
| 556
| Monster \"A\"
| 1000000
| NULL
| NULL
| NULL
| NULL
| NULL
| NULL
|
[/quote]
Láthatjuk, hogy a \'kocsi\' tábla minden sora ki lett listázva, és mellé a \'modellista\' sorai. Ahol nem volt kapcsolódó sor, ott minden érték NULL lett, ezzel jelezte felénk a rendszer, hogy ott nem volt találat.
C) RIGHT JOIN:
Pontosan ugyanazt csinálja mint a LEFT JOIN, csak épp a jobb oldali táblával. Tehát a jobb oldali tábla minden sorát meg fogjuk kapni, ha a jobb oldali táblában nincs az adott sorhoz kapcsolódó sor, akkor ugyanúgy NULL karaktereket kapunk.
Lekérdezésünk:
SELECT * FROM `modellista` RIGHT JOIN `kocsi` ON ( `kocsi`.`modellid` = `modellista`.`modellid` )
Lényegében teljesen ugyanaz, mint eddig volt, csak most RIGHT szócska van a JOIN elõtt.
Nézzük az eredményt:
id
| modellid
| nev
| ar
| id
| modellid
| szin
| xcoord
| ycoord
| zcoord
|
NULL
| NULL
| NULL
| NULL
| 1
| 522
| 1
| 1000
| 1000
| 1000
|
3
| 520
| Sultan
| 150000
| 2
| 520
| 2
| 1005
| 1005
| 1005
|
1
| 411
| Infernus
| 200000
| 3
| 411
| 3
| 1010
| 1010
| 1010
|
[/quote]
Láthatjuk amit elõrevetítettem, a jobb oldali táblából minden adatot megkaptunk, ahol pedig nem volt a bal oldali táblában adat, ott csakugyan mint a LEFT JOIN példában, \'NULL\'-t kaptunk eredményül. Itt láthatjuk, hogy a sorok sorrendje alapértelmezetten a jobb oldali tábla alapértelmezett (rendezés nélküli) sorrendje lesz.
Nos ennyi lenne. Remélem nem írtam el semmit. Nem vagyok túl jó magyarázásban, ezért mutattam a példákat. A jobb és bal oldalt úgy kell érteni, hogy a JOIN-hoz képest jobb oldalon lévõ tábla, és bal oldalon lévõ tábla. Ha esetleg lenne még kérdésed, akkor szívesen válaszolok :)
Dupla hozzászólás automatikusan összefûzve. ( 2012. július 18. - 22:04:05 )
Még annyit kérhetnék, hogy leellenörizd, hogy ebben mi lehet a hiba?
format(query, sizeof(query), \"SELECT * FROM \'Players\' INNER JOIN \'Players2\' ON (\'Players\'.\'Name\' = \'Players2\'.\'Name\') WHERE \'Players\'.\'Name\' LIKE \'%s\' AND \'Players\'.\'IP\' LIKE \'%s\'\", Name(playerid), IP);
Errorid:1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'.\'RegID\' FROM \'Players\' INNER JOIN \'KihivasokRekordok\' ON (\'Players\'.\'Name\' = \'P\' at line 1
Aposztróf helyett (\') azt a hülye másik karaktert használd, csak olyan nincs a billentyûzetemen, ezért írtam \'\'-et.
Így jó lesz:
format(query, sizeof(query), \"SELECT * FROM `Players` INNER JOIN `Players2` ON (`Players`.`Name` = `Players2`.`Name`) WHERE `Players`.`Name` LIKE \'%s\' AND `Players`.`IP` LIKE \'%s\'\", Name(playerid), IP);
-
Még így sem igazán tetszik neki
[11:38:14] errorid: 1054, error: Unknown column \'Players2.Name\' in \'on clause\'
[11:46:10] errorid: 1064, error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'LIKE \'194.38.112.237\' WHERE `RegID` = 1\' at line 1
Dupla hozzászólás automatikusan összefûzve. ( 2012. július 19. - 12:04:31 )
Egyébként köszönöm szépena részletes leirást értem :D
-
Ha nem másolod be a teljes lekérést, csak a hibaüzenetet, abból nem tudom megmondani mi a hiba :)
-
a lekérés az amit te adtál :D
-
Az elsõ error:
[11:38:14] errorid: 1054, error: Unknown column \'Players2.Name\' in \'on clause\'
Ez azt jelenti, hogy a Players2 táblába nincs Name mezõ.
A második error:
[11:46:10] errorid: 1064, error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'LIKE \'194.38.112.237\' WHERE `RegID` = 1\' at line 1
Na ilyet nem adtam :D Ebben viszont az a hiba, hogy a LIKE a WHERE elõtt van.
-
Köszönöm szépen Anthony mûködik midnen értem is az egészet :D köszönöm :)