Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
22.09.2007 20:40:18
abi vaja: mysql JOIN (?) |
|
|
Nimelt on probleem, et oleks vaja korraga kahest tabelist infot saada, aga ei taha kahte päringut teha. Lisaks tahan üleüldse lehel päringute arvu vähendada. Aga see info seisneb selles, et ühest tabelist võtan info, mida laon siis veebilehele, aga selles tabelis pole kellaaega, millal info on uuendatud. Aja info on teises tabelis, aega on vaja vaid selleks, et sorteerida uuemad ülespoole.
Kuidas ma saaksin kasutada ORDER BY xxx DESC selle esimese tabeli andmete sortimiseks, kui esimeses tabelis pole tulpa nimega xxx, kuigi on olemas asja ID-d, mis on olemas ka teises tabelis?
Kui jutt liiga segane oli, siis seletan lisaks, et mainitud esimene tabel on näiteks mingi klubi liikmete tabel. Teine tabel aga on kasutajate tabel, kus muuhulgas on nende sisselogimise ajad. Sisselogimise aegu ju klubi tabelis ei ole. Aga mul on just vaja klubi liikmed (ID järgi) klubi tabelist sortida sisselogimise aja järgi... Kusagilt jäi silma käsk JOIN, aga kui kusagil olen seda näinud, kuidas kasutatakse, siis võtab silme eest mustaks ja aru ei saa. Sooviksin teada põhimõtet, kuidas seda kasutatakse ja siis saaks päringute arvu vaos hoida...
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
Valdars
HV veteran
liitunud: 22.02.2003
|
22.09.2007 20:51:11
|
|
|
SELECT * FROM tabel1
LEFT JOIN tabel2 ON tabel1.id=tabel2.id
|
|
Kommentaarid: 47 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
44 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
22.09.2007 21:06:48
|
|
|
hmm... aga sortimist ei toimunud ikka. :S
Tegin nii:
php:
|
$sql = mysql_query("SELECT * FROM klubiliikmed LEFT JOIN kasutajad ON (klubiliikmed.user_id = kasutajad.id) WHERE user_id='$userid' AND rank='0' AND act=1 ORDER BY aeg DESC LIMIT $limit");
|
Miskipärast ta ei sordi "aeg" järgi absoluutselt.
Täpsustan, et user_id, rank ja act asuvad klubiliikmete tabelis, id ja aeg asub kasutajate tabelis.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
22.09.2007 21:25:26
|
|
|
ORDER BY kasutajad.aeg
alati kui tegu on mitme tabeliga, siis on soovitav kasutada tabeli määramist iga elemendi puhul
kiirem ja selgem andmebaasimootori jaoks
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
linnumees
HV kasutaja
liitunud: 15.06.2005
|
22.09.2007 21:25:49
|
|
|
SELECT * FROM klubiliikmed AS a LEFT JOIN kasutajad AS b
ON a.user_id = a.id
WHERE a.user_id = '$userid' AND a.rank = '0' AND a.act = '1'
ORDER BY b.aeg DESC LIMIT $limit |
Kui samanimelisi välju ei ole, siis tegelikult võid ka lihtsalt välja nime kasutada - kuid välju tekib aja jooksul juurde ja mõne asja tabelist järgi vaatamine on mõnikord üsnagi vaevaline... : )
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
23.09.2007 09:53:02
|
|
|
mikk36 kirjutas: |
ORDER BY kasutajad.aeg |
Tegin nii, aga miskipärast pole mingi vahet - ikka sordib absoluutselt random.
Sinna tulpa aeg salvestatakse formaadis time()
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
23.09.2007 10:52:55
|
|
|
mis seal väljal siis reaalselt on ja mis tüüpi see väli mysql'is on?
too mõni näide
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
23.09.2007 11:08:36
|
|
|
see tulp ´aeg´ on int(15), not null, default "0"; seal on andmed time()-formaadis, iga kasutaja lehel käimise aeg siis. Näiteks ühel on 1190529941 ja teisel on 1190495669 jne.
Kas neid siis ei saa sortida? Ma olen mingis teises tabelis küll saanud time() järgi edukalt sortida.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
taavi
HV veteran
liitunud: 04.02.2002
|
23.09.2007 12:42:19
|
|
|
tsitaat: |
WHERE a.user_id = '$userid' |
sa pärid andmebaasist ühe rea (võib-olla on minu loogika vale, aga niimoodi see päring välja näeb)? kui jah, siis mismoodi sorteerimine peaks välja nägema?
|
|
Kommentaarid: 60 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
55 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
23.09.2007 12:44:45
|
|
|
aa selge, lisaks tuleb ju while($array = mysql_fetch_array($sql)){ // } ja just see sikutabki sealt 25 rida välja.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
linnumees
HV kasutaja
liitunud: 15.06.2005
|
23.09.2007 16:25:39
|
|
|
Ah ei midagi.. :p
viimati muutis linnumees 23.09.2007 20:38:06, muudetud 1 kord |
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
|
tanzanite
HV kasutaja
liitunud: 13.05.2006
|
23.09.2007 18:38:11
|
|
|
Kasuta LEFT JOINI asemel (kust see idee tuli?) INNER JOINI. Kahtlustan, et j2rjestad hunnikuid NULLe - ehk b.aeg IS NULL .
|
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
23.09.2007 19:40:21
|
|
|
Ei olnud midagi vahet, kas LEFT või INNER - ta on võtnud mingi suvalise reegli, mille järgi paigutab. Ei ole see alfabeet ega aeg. :S
Kogu päring siis on umbes selline:
php:
|
$limit = 25; //näiteks 25 antud juhul $sql = mysql_query("SELECT * FROM klubiliikmed LEFT JOIN kasutajad ON (klubiliikmed.user_id = kasutajad.id) WHERE user_id='$userid' AND rank='0' AND act=1 ORDER BY aeg DESC LIMIT $limit"); echo $array["user_name"]. "<br>"; }//while
|
Ja just nii nee 25 kasutajanime tulevadki, aga kõik sorteerimata! :/
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
ailar666
HV vaatleja
liitunud: 03.03.2005
|
24.09.2007 00:04:41
|
|
|
Midagi sellist äkki ?
SELECT t1.*, t2.aeg from klubiliikmed as t1, kasutajad as t2 where t1.user_id = t2.id where t1.user_id = X AND t1.rank = 0 AND t1.act = 1 ORDER BY t2.aeg DESC LIMIT 0, 30 |
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
24.09.2007 11:24:57
|
|
|
ailar666 kirjutas: |
Midagi sellist äkki ?
SELECT t1.*, t2.aeg from klubiliikmed as t1, kasutajad as t2 where t1.user_id = t2.id where t1.user_id = X AND t1.rank = 0 AND t1.act = 1 ORDER BY t2.aeg DESC LIMIT 0, 30 |
|
Selle mittetöötava lahenduse tulemuseks tuli teade:
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 'WHERE a.user_id='xxxx' AND a.rank='0' AND a.act=1 ORDER BY
Ma ei tea, kas see on sellest, et 2x järjest tuleb WHERE, mida ma varem pole näinud kusagil nii.
EDIT:
Vahetasin teise "WHERE" nüüd "AND" vastu ja siis ei tulnud veateadet, sorteeris asjad natuke teisiti kui enne, aga IKKA loomulikult juhujärjekorras, mis pole üldse seotud tulbaga ´aeg´
Üldiselt tundub, et ta sordib kasutajad nende endi ID järgi (ASC), mitte aga aja järgi + DESC. Viimase näite põhjal sortis üldse arusaamatult.
Igatahes on soov järjestada "klubiliikmete" tabelist võetud kasutajad tulba "aeg" järgi, viimane aga asub "kasutajate" tabelis. Miskipärast ei õnnestu ikka veel.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
tomps01
HV vaatleja
liitunud: 09.06.2004
|
24.09.2007 13:35:21
|
|
|
Vaatad sa päringu tulemust muidu vahel otse miski MySQLi kasutajaliidese kaudu või ainult browseriga, peale PHP abil parsimist? Kui sa "otse" ei vaata, siis äkki su PHP skript laseb seda päringut mitu korda käima erinevate user_id'dega või su PHP skript paneb aja valesti kokku.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
tanzanite
HV kasutaja
liitunud: 13.05.2006
|
24.09.2007 13:35:32
|
|
|
SGM kirjutas: |
Ei olnud midagi vahet, kas LEFT või INNER - ta on võtnud mingi suvalise reegli, mille järgi paigutab. Ei ole see alfabeet ega aeg. :S
Kogu päring siis on umbes selline:
php:
|
$limit = 25; //näiteks 25 antud juhul $sql = mysql_query("SELECT * FROM klubiliikmed LEFT JOIN kasutajad ON (klubiliikmed.user_id = kasutajad.id) WHERE user_id='$userid' AND rank='0' AND act=1 ORDER BY aeg DESC LIMIT $limit"); echo $array["user_name"]. "<br>"; }//while
|
Ja just nii nee 25 kasutajanime tulevadki, aga kõik sorteerimata! :/ |
Näen endiselt ainult ühte võimalust:
kuna kasutad LEFT JOINi siis juhul kui sobivat paremat poolt (misiganes põhjusel) ei saada on ajad kõik NULLid => järjekord üsna suvaline.
lisa ...
echo $array["user_name"]."<br>";
... järele veel ka ...
echo $array["aeg"]."<br>";
... ja postita kuvatavad ajad siin.
|
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
24.09.2007 16:47:26
|
|
|
Raibe kuvab kellaaegade asemel nulle "0" :S Tabelis on aja tulbas default="0", aga neil kasutajatel, kellel seal aeg olemas on, kuvab selles listis ikka 0...
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
24.09.2007 18:07:59
|
|
|
teeks nii et sa annad meile täpselt tulpade nimed ja tabelite nimed, mida sul vaja on
ehitaks sulle ise korraliku query kokku
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
26.09.2007 18:48:32
|
|
|
Nüüd veel 1 müstika on JOIN-iga. Mul on 2 päringut, mis võtavad 2-st eri tabelist ridade arvu mysql_num_rows'iga, aga tahaks seda ühe päringuga teostada. EI saa! Siis tekib tulemus umbes kolmekordne!
Enne töötas õigesti, siis asi oli nii:
$mpsql1 = mysql_query("SELECT id FROM tabel1 WHERE user_id = '$u_id'");
$palju1 = mysql_num_rows($mpsql1);
$mpsql2 = mysql_query("SELECT id FROM tabel2 WHERE user_id = '$u_id'");
$palju2 = mysql_num_rows($mpsql2);
$palju = $palju1 + $palju2; |
Nüüd üritasin JOIN-i kasutada ja tulemus on vale:
$mpsql1 = mysql_query("SELECT * FROM tabel1 AS a LEFT JOIN tabel2 AS b ON (a.user_id = b.user_id) WHERE a.user_id = '$u_id'");
$palju = mysql_num_rows($mpsql1); |
Imelik...
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
26.09.2007 21:20:41
|
|
|
Väga hea, töötab!
Aga nii vist ei saa teha, et kui mul on 4 asja, näiteks a,b,c,d -- on vaja leida, mitu A-d, B-d, C-d ja D-d on olemas mingil kasutajal. Hetkel teen seda 4 järjest päringuga erinevatest tabelitest. Eelmisest postitusest on siin erinev see, et nende kõigi väärtust ei pea ühte liitma vaid soovin eraldi värtused muutujatele $a, $b, $c ja $d, aga kui saaks seda ühe päringuga teha, oleks väga hea.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
taavi
HV veteran
liitunud: 04.02.2002
|
|
Kommentaarid: 60 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
55 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
28.09.2007 11:29:16
|
|
|
Kui ma nüüd õigesti aru sain, siis seal ju näidatakse, kuidas saab ühe tabeli seest teatud asju lugeda, aga mul on 4 päringut 4 eri asja lugemiseks ja kahes kohas on nii. Ühes kohas on vaja lugeda ühe kasutaja kohta arve 4-st eri tabelist, teises kohas vaja lugeda 2-st tabelist, aga viimasel juhul mõlemast tabelist kahtepidi.
$sql = mysql_query("select * from tabel1 where user_id='$user_id' AND abc='0'");
$mitu1=mysql_num_rows($sql);
$sql = mysql_query("select * from tabel1 where other_id='$user_id' AND abc='0'");
$mitu2=mysql_num_rows($sql);
$sql = mysql_query("select * from tabel2 where user_id='$user_id'");
$mitu3=mysql_num_rows($sql);
$sql = mysql_query("select * from tabel2 where other_id='$user_id'");
$mitu4=mysql_num_rows($sql); |
Kõige selle tahaks teha ühe päringuga, kui võimalik...
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
taavi
HV veteran
liitunud: 04.02.2002
|
28.09.2007 11:43:53
|
|
|
tsitaat: |
Kõige selle tahaks teha ühe päringuga, kui võimalik...
|
seleta miks.
tegelikult oli see link mõeldud selleks, et sa select * ... asemel count() funktsiooni kasutaksid.
|
|
Kommentaarid: 60 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
55 |
|
tagasi üles |
|
|
|