Szerző Téma: MYSQL JOIN  (Megtekintve 2383 alkalommal)

MYSQL JOIN
« Dátum: 2012. július 18. - 14:23:51 »
0 Show voters
Ü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

Nem elérhető tonyo

  • 1335
  • Moderális Generátor
    • Profil megtekintése
MYSQL JOIN
« Válasz #1 Dátum: 2012. július 18. - 14:25:48 »
+1 Show voters
Ha külön sorba akarod, akk UNION. A JOIN egy sorban adja vissza az értékeket.

MYSQL JOIN
« Válasz #2 Dátum: 2012. július 18. - 14:29:27 »
0 Show voters
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

Nem elérhető tonyo

  • 1335
  • Moderális Generátor
    • Profil megtekintése
MYSQL JOIN
« Válasz #3 Dátum: 2012. július 18. - 15:15:05 »
+1 Show voters
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 :)

MYSQL JOIN
« Válasz #4 Dátum: 2012. július 18. - 20:39:27 »
0 Show voters
É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
« Utoljára szerkesztve: 2012. július 18. - 21:44:55 írta hegdavid95 »

Nem elérhető tonyo

  • 1335
  • Moderális Generátor
    • Profil megtekintése
MYSQL JOIN
« Válasz #5 Dátum: 2012. július 18. - 22:00:06 »
+3 Show voters
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 )

Idézetet írta: hegdavid95 date=1342636767\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"24620\" data-ipsquote-contentclass=\"forums_Topic
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);
« Utoljára szerkesztve: 2012. július 18. - 22:04:23 írta Anthony »

MYSQL JOIN
« Válasz #6 Dátum: 2012. július 19. - 12:03:28 »
0 Show voters
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

Nem elérhető tonyo

  • 1335
  • Moderális Generátor
    • Profil megtekintése
MYSQL JOIN
« Válasz #7 Dátum: 2012. július 19. - 12:16:52 »
+1 Show voters
Ha nem másolod be a teljes lekérést, csak a hibaüzenetet, abból nem tudom megmondani mi a hiba :)

MYSQL JOIN
« Válasz #8 Dátum: 2012. július 19. - 15:53:24 »
0 Show voters
a lekérés az amit te adtál :D

Nem elérhető tonyo

  • 1335
  • Moderális Generátor
    • Profil megtekintése
MYSQL JOIN
« Válasz #9 Dátum: 2012. július 19. - 16:02:15 »
+1 Show voters
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.

MYSQL JOIN
« Válasz #10 Dátum: 2012. július 19. - 17:25:06 »
0 Show voters
Köszönöm szépen Anthony mûködik midnen értem is az egészet :D köszönöm :)
« Utoljára szerkesztve: 2012. július 19. - 17:34:01 írta hegdavid95 »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal