Argentum
Toru
 
Registreerunud: 18.11.2009
Asukoht: Tallinn
Kasutaja on eemal
Tuju: Päris hea
|
|
|
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
|
|
0 |
|
madish
Noor toru

Registreerunud: 24.11.2009
Kasutaja on eemal
|
|
|
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;
|
|
0 |
|
DonQ
Administraator
      
Registreerunud: 16.7.2009
Asukoht: Saturn
Kasutaja on eemal
Tuju: Kerge puhkus
|
|
| 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]
|
|
0 |
|
Argentum
Toru
 
Registreerunud: 18.11.2009
Asukoht: Tallinn
Kasutaja on eemal
Tuju: Päris hea
|
|
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]
|
|
0 |
|
Argentum
Toru
 
Registreerunud: 18.11.2009
Asukoht: Tallinn
Kasutaja on eemal
Tuju: Päris hea
|
|
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]
|
|
0 |
|
DonQ
Administraator
      
Registreerunud: 16.7.2009
Asukoht: Saturn
Kasutaja on eemal
Tuju: Kerge puhkus
|
|
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
|
|
0 |
|
Argentum
Toru
 
Registreerunud: 18.11.2009
Asukoht: Tallinn
Kasutaja on eemal
Tuju: Päris hea
|
|
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]
|
|
0 |
|
DonQ
Administraator
      
Registreerunud: 16.7.2009
Asukoht: Saturn
Kasutaja on eemal
Tuju: Kerge puhkus
|
|
|
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 ...
|
|
0 |
|
Argentum
Toru
 
Registreerunud: 18.11.2009
Asukoht: Tallinn
Kasutaja on eemal
Tuju: Päris hea
|
|
|
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
|
|
0 |
|
DonQ
Administraator
      
Registreerunud: 16.7.2009
Asukoht: Saturn
Kasutaja on eemal
Tuju: Kerge puhkus
|
|
|
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.
|
|
0 |
|
Argentum
Toru
 
Registreerunud: 18.11.2009
Asukoht: Tallinn
Kasutaja on eemal
Tuju: Päris hea
|
|
|
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?
|
|
0 |
|
hullwend
Toru
 
Registreerunud: 21.7.2009
Kasutaja on eemal
|
|
|
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
|
|
0 |
|
DonQ
Administraator
      
Registreerunud: 16.7.2009
Asukoht: Saturn
Kasutaja on eemal
Tuju: Kerge puhkus
|
|
|
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.
|
|
0 |
|
madish
Noor toru

Registreerunud: 24.11.2009
Kasutaja on eemal
|
|
|
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
|
|
0 |
|
hullwend
Toru
 
Registreerunud: 21.7.2009
Kasutaja on eemal
|
|
join on kahe või enama tabeli query tegemiseks
|
|
0 |
|
DonQ
Administraator
      
Registreerunud: 16.7.2009
Asukoht: Saturn
Kasutaja on eemal
Tuju: Kerge puhkus
|
|
|
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?
|
|
0 |
|
madish
Noor toru

Registreerunud: 24.11.2009
Kasutaja on eemal
|
|
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]
|
|
0 |
|