TORU Foorum

MySql mitme tabeli päring

Argentum - 10.5.2010 16:03

tervist foorumlased

Mure siis selles. Et mul on 3 tabelit ning igas tabelis siis vastavalt veerud:

t1:user
user_id
user_name

t2:data
data_id
user_id
where_id
date
times

t3:where
where_id
where_name

kuidas ma saaksin nii info kolmest tabelist korraga et päring seoks t2.user_id = t1.user_id ja t2.where_id = t3.where_id

Where t2.user_id = ´1´

2 tabeli JOIN-iga saan hakkam aga kui kolmega üritan siis viskab villast. Ehk keegi oskab jagada selle päringu mudelit. Mõistus kahjuks otsas.

Et plaan siis kuvada data tabeli infot nii et user_id asemel näitab t1 saadud nime ja where_id asemel näitab t3 saadud where väärtust.

Ehk ei olnd segane.

Ettetänades
Ag


madish - 10.5.2010 16:43

select user_name, date, times, where_name from t1, t2, t3 where t3.where_id=t2.where_id && t2.user_id=t1.user_id && t1.user_id=1;

DonQ - 10.5.2010 18:01

Kood:
select t1.user_name, t2.date, t2.times, t3.where_name from t1 inner join t2 on t2.user_id=t1.user_id inner join t3 on t3.where_id=t2.where_id where t1.user_id = 1


Mida Sa ise teisiti tegid?

PS. madish lahendus toimib ka, aga pole eriti kena ja ei võimalda huvitavamaid JOINe kasutada.

[Muudetud: 10.5.2010 DonQ]

Argentum - 10.5.2010 18:40

Ise tegin nii:

Kood:
SELECT t1.*, t2.*, t3.* FROM t2 JOIN t1 WHERE t2.user_id = t1.user_id AND t2 JOIN t3 WHERE t2.where_id = t3.where_id AND t2.user_id =´1´



[Muudetud: 10.5.2010 Argentum]

Argentum - 10.5.2010 19:09

Hmm katsetan DonQ päringut kuid viskab villast veits.

erroriks:
Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in ...../userdata.php on line 44

DonQ kood siis mugavdatud minu tegeliku süsteemi. Aga viskab sama errorit kui ma ise pusisin :S

Kood:
$query="SELECT h_user.user_name, h_turnadata.data_points, h_turnadata.data_win, h_turnadata.data_buyin, h_turnadata.data_cost, h_turnadata.data_take, h_turnadata.data_playtime, h_turnas.turna_name, h_turnas.turna_date, h_turnas.turna_players, h_turnas.turna_name FROM h_user INNER JOIN h_turnadata ON h_turnadata.data_user_id = h_user.user_id INNER JOIN h_turnas ON h_turnas.turna_id = h_turnadata.data_turna_id WHERE h_user.user_id = '1'"; $result=mysql_query($query);


Selgituseks milleks ma sellise asjaga tegelen on see, et huvitab veebi põhine andmebaasindus ja php ning õppeks võtsin projekti kus sõpradega pokrit mängides saaks veebis kuvada turnade kokkuvõtteid. Kõige muuga sain hakkama, aga ei saa seda, et vastavalt kasutaja ID põhjal näitaks turnasi kus on osalenud ja tema tulemusi vastavas turnas


[Muudetud: 10.5.2010 Argentum]

DonQ - 10.5.2010 19:33

No aga kui Sa sama päringu phpMyAdmin (või mis iganes haldusvahend Sul baasi jaoks on) käivitad, mis vea ta siis saab? Esmapilgul näib asi korras olema - võib-olla mõni väljanimi valesti? Mida mysql_error() funktsioon peale mysql_query() käivitamist ütleb? Kui Sa selecti taha vaid ühe välja kirjutad (h_user.user_id; loomulikult jätad JOINid jm paika), mis siis juhtub?

Heh, asja üle vaadates näen, et Sul on väljade loetelus h_turnas.turna_name kaks korda - ju see pole hea, kui kaks sama nimega välja tulemuses on :)

Argentum - 10.5.2010 20:06

SQL query phpmyadminis ütleb errori

#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 'FROM h_user INNER JOIN h_turnadata ON h_turnadata.data_user_i' at line 2

ja päring sql-is näeb välja:

Kood:
SELECT h_user.user_name, h_turnadata.data_points, h_turnadata.data_win, h_turnadata.data_buyin, h_turnadata.data_cost, h_turnadata.data_take, h_turnadata.data_playtime, h_turnas.turna_name, h_turnas.turna_date, h_turnas.turna_players, FROM h_user INNER JOIN h_turnadata ON h_turnadata.data_user_id = h_user.user_id INNER JOIN h_turnas ON h_turnas.turna_id = h_turnadata.data_turna_id WHERE h_user.user_id = '1' LIMIT 0 , 30



Hakkasin DIIBIMALT pusima ja jagasi ise ka laksu lahti. Esimene viga oli see, et koma oli lõpus, et nagu tuleks mingi rida veel. Ja teiseks oli viga viimases joindis. Et kirjutasin turna_id, oli hoopis turn_id

Tänud DonQ see jupp tõesti töötab. Lihtsalt endal silmi eest kirju et nii palju tulpade nimesi ja suht sarnased, et raske jälgida seda trükkimis korrektsust


[Muudetud: 10.5.2010 Argentum]

DonQ - 10.5.2010 20:58

Näägutamise korras soovitan järgmisel korral väljadele (tulpadele, veergudele) erinevamad nimed välja mõelda, samas mingit süteemi kasutades. Ehk sul on segamini turn, turna, turnas, turnadata, turnas.data, turna_date jne - üsna raske on jälgida endalgi.

Veel näägutamise korras soovitan JOINide puhul aliasi kasutada (ja mitte A, B või X, Y, vaid midagi tähendavaid). Päring läheb lühemaks ja selgemaks, näiteks nii:

SELECT U.user_name, TD.data_points, TD.data_win ...
FROM h_user U INNER JOIN h_turnadata TD ON TD.data_user_id = U.user_id ...

Argentum - 10.5.2010 21:24

Ma ise vaatasin ka, et kole keeruliseks läeb see jälgimine. Alguses ei saand aru kui tegin ühe realise päringu aga nüüd läeb juba päris kirjuks. Ei kujuta ette kui see päringu suurus veel rohkem kasvab. Kas võib tabeli nimedes kasutada suuri tähti?

igalt poolt lugedes sain aru, et päringud on suute tähtedega a la SELECT, WHERE, AND, JOINT jne ja tabelite ja veergude nimed peavad olema väikesed tähed.

ise siin mõtsin et peaks jah siin piirduma kuidagi 3-4 tähelisi tabeleid ja nimesi kasutama

DonQ - 10.5.2010 21:42

Suured ja väikesed tähed pole üldiselt olulised. Näiteks mina kasutan alati väikesi tähti (mitte siin näites), suurem osa kolleege kirjutavad SELECT jm võtmesõnad suurte tähtedega, mõnes kohas olen näinud ka "Select" kujulisi asju (mis ei ole hea mõte), mõned kirjutavad ka tabelinimed suurte tähtedega. Tee nii, nagu Sulle endale loetavam tundub, paiguta osa teksti uuele reale (sa võid iga koha pealt, kus koma või tühik või muu märk on, rea poolitada), nihuta rea algused vastavalt kontekstile jne jne.

Tabeli- ja väljanimesid ära tee liiga lühikesi (lähevad pikapeale meelest ära); keerulises päringus saab tabelite puhul aliasi kasutada ja väljade nimed peavad ikka iseennast kirjeldavad olema.

Argentum - 11.5.2010 11:55

DonQ räägi mulle lähemalt aliastest ja asjadest? mis moodi aliasi saab määrata või on sql-il automaatselt juba mingi vaike aliased?

hullwend - 11.5.2010 12:02

Srry et vahele segan aga DonQ näitest saad ka snitti:

SELECT U.user_name, TD.data_points, TD.data_win ...
FROM h_user U INNER JOIN h_turnadata TD ON TD.data_user_id = U.user_id ...

Aliase paned lihtsalt tabeli nime järgi (enda vabal valikul) või kirjutad ..FROM h_user AS alias

DonQ - 11.5.2010 13:23

Ehk siis minu näites need U ja TD olidki aliased. Kohustuslikud on nad juhul, kui ühte tabelit iseendaga JOINid - siis peab kuidagi vahet tegema; muidu on nad lihtsalt abiks loetavuse parandamisel.

madish - 11.5.2010 14:15

nonii, minu suurepärane näide ei vaja üldse aliasi.
ja on nagu robotite päring - kõik küsitakse otse välja.
aga harige mind ka, miks neid joine vaja on? :P

hullwend - 11.5.2010 14:49

join on kahe või enama tabeli query tegemiseks :)

DonQ - 11.5.2010 15:49

hullwend, lihtsamal juhul saab mitme tabeli korral where tingimusega hakkama, aga see ei näe kena välja. Where on ikkagi mõeldud päringu tingimuste seadmiseks ja join päringu struktuuri määramiseks.

madish, aliased on igas päringus (mis üle ühe tabeli kasutab) kasulikud. Samuti olid sinu näites puudu tabeli/aliaste nimed väljade eest - see töötab täpselt niikaua, kuni keegi tabelisse ilma koguolemasolevat koodi läbi lugemata paar sobiva nimega välja juurde teeb.
Lisaks kirjuta mulle Sinu jaoks normaalsel kujul (ehk ilma 'join'ideta) järgmised:

select a.name as nimi, b.name as sobra_nimi from a full outer join b on b.id=a.id
select a.name as nimi, d.bp as punkte from a left join (select c.id, sum(b.points) as bp from b inner join c on c.id=b.id group by c.id) as d on d.id=a.id

Samuti võimaldab 'join'ide kasutamine koodi ülevaatlikumaks muuta (ausõna, see on oluline!). Ütleme mul on 10-20 tabelit kokku lingitud (vähegi normaliseeritud baasis elementaarne) - kujutad sa ette, kuidas seda where tingimustega teha nii, et keegi asjast midagi aru ka saab?

madish - 11.5.2010 16:51

noh, mulle on õpetatud ainult where lauseid, joine olen näinud ainult mõnedes rakendustes, mille koodi muutma olen pidanud.
seega on minu jaoks ainus arusaadav pilt where laused, joinidest ei saa ma küll suurt aru.
nii, et kui keegi tahab minu jaoks arusaadavat koodi kirjutada, siis where laused on parim variant(hetkel veel).

kui tabelisse välju juurde tehakse, siis see lause töötab ikkagi, ainult, et neid uusi välju ei kasutata ju. katki ei lähe midagi.

PS. ma ei ürita where majandust kaitsta, vaid join asjandusest aru saada :)

[Muudetud: 11.5.2010 madish]

[Muudetud: 11.5.2010 madish]