Avaleht
uus teema   vasta Tarkvara »  WWW »  abi vaja: mysql JOIN (?) märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 22.09.2007 20:40:18 abi vaja: mysql JOIN (?) vasta tsitaadiga

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... icon_rolleyes.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Valdars
HV veteran
Valdars

liitunud: 22.02.2003




sõnum 22.09.2007 20:51:11 vasta tsitaadiga

SELECT * FROM tabel1
LEFT JOIN tabel2 ON tabel1.id=tabel2.id
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 45
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 22.09.2007 21:06:48 vasta tsitaadiga

hmm... aga sortimist ei toimunud ikka. :S
Tegin nii:
php:
  1. $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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 22.09.2007 21:25:26 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
linnumees
HV kasutaja

liitunud: 15.06.2005




sõnum 22.09.2007 21:25:49 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 23.09.2007 09:53:02 vasta tsitaadiga

mikk36 kirjutas:
ORDER BY kasutajad.aeg

Tegin nii, aga miskipärast pole mingi vahet - ikka sordib absoluutselt random. icon_confused.gif
Sinna tulpa aeg salvestatakse formaadis time()
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 23.09.2007 10:52:55 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 23.09.2007 11:08:36 vasta tsitaadiga

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. icon_razz.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
taavi
HV veteran

liitunud: 04.02.2002



Autoriseeritud ID-kaardiga
sõnum 23.09.2007 12:42:19 vasta tsitaadiga

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: 70 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 23.09.2007 12:44:45 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
linnumees
HV kasutaja

liitunud: 15.06.2005




sõnum 23.09.2007 16:25:39 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tanzanite
HV kasutaja
tanzanite

liitunud: 13.05.2006




sõnum 23.09.2007 18:38:11 vasta tsitaadiga

Kasuta LEFT JOINI asemel (kust see idee tuli?) INNER JOINI. Kahtlustan, et j2rjestad hunnikuid NULLe - ehk b.aeg IS NULL .
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 23.09.2007 19:40:21 vasta tsitaadiga

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:
  1. $limit = 25; //näiteks 25 antud juhul
  2. $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");
  3.         while($array = mysql_fetch_array($sql)){
  4.         echo $array["user_name"]."<br>";
  5.         }//while

Ja just nii nee 25 kasutajanime tulevadki, aga kõik sorteerimata! :/
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
ailar666
HV vaatleja

liitunud: 03.03.2005




sõnum 24.09.2007 00:04:41 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 24.09.2007 11:24:57 vasta tsitaadiga

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. icon_rolleyes.gif

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´ icon_confused.gif
Ü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. icon_sad.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tomps01
HV vaatleja

liitunud: 09.06.2004




sõnum 24.09.2007 13:35:21 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
tanzanite
HV kasutaja
tanzanite

liitunud: 13.05.2006




sõnum 24.09.2007 13:35:32 vasta tsitaadiga

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:
  1. $limit = 25; //näiteks 25 antud juhul
  2. $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");
  3.         while($array = mysql_fetch_array($sql)){
  4.         echo $array["user_name"]."<br>";
  5.         }//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
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 24.09.2007 16:47:26 vasta tsitaadiga

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... icon_confused.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 24.09.2007 18:07:59 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 26.09.2007 18:48:32 vasta tsitaadiga

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! icon_eek.gif
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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 26.09.2007 20:49:39 vasta tsitaadiga

selliseks puhuks on vajalik union icon_wink.gif
sa tahad liita 2 päringut
Join on tabelite liitmiseks, union päringute

ehk siis:
sql:
  1. (SELECT id FROM tabel1 WHERE user_id = '$u_id') UNION (SELECT id FROM tabel2 WHERE user_id = '$u_id')
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 26.09.2007 21:20:41 vasta tsitaadiga

Väga hea, töötab! thumbs_up.gif
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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
taavi
HV veteran

liitunud: 04.02.2002



Autoriseeritud ID-kaardiga
sõnum 26.09.2007 21:21:48 vasta tsitaadiga

selle asemel, et päringuid kokku tõsta, loe hoopis seda: http://dev.mysql.com/doc/refman/5.0/en/counting-rows.html
Kommentaarid: 70 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 28.09.2007 11:29:16 vasta tsitaadiga

taavi kirjutas:
selle asemel, et päringuid kokku tõsta, loe hoopis seda: http://dev.mysql.com/doc/refman/5.0/en/counting-rows.html

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. icon_rolleyes.gif
$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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
taavi
HV veteran

liitunud: 04.02.2002



Autoriseeritud ID-kaardiga
sõnum 28.09.2007 11:43:53 vasta tsitaadiga

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: 70 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 28.09.2007 13:27:10 vasta tsitaadiga

Sest mul on vaja lehel kuvada 4 eri numbrit. Need $mitu1, $mitu2 jne. Neil kõigil peab olema oma väärtus. Aga selle saamiseks ei taha nii palju päringuid teha. :/
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tomps01
HV vaatleja

liitunud: 09.06.2004




sõnum 28.09.2007 15:15:21 vasta tsitaadiga

Kui sa count(*) aru saad, siis võid proovida järgmist asja (ma loodan et mysql lubab 0 selectida):
  (SELECT count(*),  0,  0 FROM tabel1 WHERE user_id = '$u_id')
UNION
(SELECT 0,  count(*),  0 FROM tabel2 WHERE user_id = '$u_id')
UNION
(SELECT 0,  0,  count(*) FROM tabel3 WHERE user_id = '$u_id')
jne.

Lihtsalt kood peaks arusaadav olema ja kui sa sellist asja teed, siis su koodi parandaja annab sulle tulevikus peksa icon_biggrin.gif
Kui sul on uuem MySQL, siis võiksid uurida stored proceduride kasutamist ja olenemata MySQLi vanusest mõelda, et äkki saad tabelid kokku tõsta.
Pealegi 4 count(*) päringut ei muuda su koodi tõenäoliselt nii meeletult aeglasemaks ja kui neid päringuid kutsutakse välja miskis tsüklis, siis äkki saad enne tsükli käivitamist vastavad read miskitesse 4 massiivi lugeda a'la

$result = mysql_query("select count(*) as arv, user_id
from tabel
where blabla
group by user_id");
while($row  = mysql_fetch_row($result)){
$massiivike[$row["user_id"]] = $row["arv"];
                                }

Ning pärast siis "õiges" tsüklis kasutad saadud massiivi.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
tanzanite
HV kasutaja
tanzanite

liitunud: 13.05.2006




sõnum 28.09.2007 15:50:25 vasta tsitaadiga

select count(1) cnt from tabel1 where this and that union select count(1) cnt from tabel2 where something else

või
select ((select count(1) from tabel1 where this and that) + (select count(1) from tabel2 where something else))

näiteks.
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 28.09.2007 17:05:20 vasta tsitaadiga

Proovisin tomps01 ülemist näidet, kuna sellest sain natukenegi aru midagi, aga tulemuseks on mingi ebanormaalne ja vale arv, pealegi ma ei oska sellest päringust võtta arve 4 erineva muutuja jaoks, (neid ei tohi kokku liita.) icon_rolleyes.gif

tanzanite on vist liiga tuumafüüsiku teadmistega, see näide siis seega käib mulle hetkel üle jõu. icon_biggrin.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 28.09.2007 17:12:24 vasta tsitaadiga

no siis jääd nelja päringuga, see ei ole nii hull kiirusekadu (millisekundites asi)
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002




sõnum 28.09.2007 17:20:43 vasta tsitaadiga

mikk36, SGMi neli päringut küsivad kogu tingimustele vastava info baasist (terved read) mitte ainult numbrit - ja see võib olenevalt info mahust olla päris suur overhead.
Igal juhul soovitaks count'i kasutada

_________________
There is no place like 127.0.0.1
Kommentaarid: 71 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 28.09.2007 18:26:15 vasta tsitaadiga

Renka kirjutas:
mikk36, SGMi neli päringut küsivad kogu tingimustele vastava info baasist (terved read) mitte ainult numbrit - ja see võib olenevalt info mahust olla päris suur overhead.
Igal juhul soovitaks count'i kasutada

Mul ongi probleem selles, et saidil on liiga palju päringuid, ja teenusepakkuja juba inises mu kallal, vahepeal pandi piirang peale mu kontole. :/ Vaja on hoida päringute arv võimalikult väike, seepärast ei taha 4 päringuga asju hoida. Aga kuidas see ikkagi välja näeks, kui tahan tabel1-st võtta info 2x - where user_id = '$u_id'; ja siis teine kord samast tabelist: where other_id = '$u_id'. Siis täpselt sama asi teha tabel2-ga, seega kokku 4 väärtust on vaja saada ja need anda 4-le erinevale muutujale. Hetkel ei mõista, kuidas see käib, kuni muutujateni välja. icon_sad.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 28.09.2007 20:12:10 vasta tsitaadiga

Renka kirjutas:
mikk36, SGMi neli päringut küsivad kogu tingimustele vastava info baasist (terved read) mitte ainult numbrit - ja see võib olenevalt info mahust olla päris suur overhead.
Igal juhul soovitaks count'i kasutada
seda küll, aga kui count ei meeldi, siis piisaks ka lihtsalt id'de sikutamisest
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
julmu
HV kasutaja
julmu

liitunud: 20.12.2004




sõnum 29.09.2007 20:39:27 vasta tsitaadiga

sql:
  1. SELECT count(*) AS kokku, 'maju' AS asi FROM majad WHERE omanik = 'SGM'
  2. UNION
  3. SELECT count(*), 'autosid' FROM autod WHERE omanik = 'SGM'
  4. UNION
  5. SELECT count(*), 'naisi' FROM naised WHERE abikaasa = 'SGM'
  6. UNION
  7. SELECT count(*), 'lapsi' FROM lapsed WHERE isa = 'SGM'


php-brief:
  1. while ($rida = mysql_fetch_assoc($result)) {
  2.     $$rida['asi'] = $rida['kokku'];
  3. }


Saad endale muutujad $maju, $autosid, $naisi ja $lapsi mis sisaldavad siis vastavat arvu
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 09.01.2008 20:19:53 vasta tsitaadiga

hmm... Nüüd on mul nii, et see $rida['asi'] sisaldab vajalikke arve järjest, näiteks nii: 11515032, aga õiged arvud oleks 115, 150, 3, 2. Kuidas ma need arvud sealt eraldada saan õigesti? Proovisin mitutmoodi, aga sain hoopis tühjust või niisama jama. icon_rolleyes.gif

EDIT:

Tulin hiljuti tagasi selle käkerdise juurde, kus mul 4 päringut järjest on 1 asemel...
Proovisin niipidi ja naapidi, aga seekord on tulemus hoopis empty() icon_confused.gif Eelmine kord vähemalt midagigi näitas - õigeid arve ühes stringis järjest...
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 09.01.2008 20:44:21 vasta tsitaadiga

topelt $ seal ees küll olla ei tohiks, lisaks peaksid sa saama iga asja koguväärtuse kätte neljast eri array elemendist: $rida[''maju], $rida['autosid'], $rida['naisi'] ja $rida['lapsi']

kui sa saad need kõik koos ühes elemendis, siis näita parem koodi kuidas ta võtab sul need
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 11.01.2008 13:30:05 vasta tsitaadiga

siiani saan ma kas tühjust või ühe nulli esimeseks väärtuseks, ülejäänud ikka tühjad. icon_confused.gif

$sql = mysql_query("SELECT count(*) AS kokku, 'id' AS asi FROM tabel1 where user_id='$sgm' AND x='0'
      UNION
      SELECT count(*), 'id' FROM tabel1 where friend='$sgm' AND x='0'
      UNION
      SELECT count(*), 'id' FROM tabel2 where user_id='$sgm'
      UNION
      SELECT count(*), 'id' FROM tabel2 where friend_id='$sgm'");

while($rida = mysql_fetch_assoc($sql)){
$rida["asi"] = $rida["kokku"];

$mitusinul = $rida["id"];
$mitusind = $rida["id"];
$mitusinutp = $rida["id"];
$mitusindtp = $rida["id"];

echo $rida["asi"];
}


See on ka imelik, et kui ma echon välja selle $rida["asi"]; siis näidatakse mulle õigeid arve ühes reas... Aga kui määran sama asja neile muutujatele enne echot, siis saab esimene muutuja väärtuseks 0 ja ülejäänud on tühjad!
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 11.01.2008 14:05:38 vasta tsitaadiga

kui sa selle query esitad phpmyadminis, kas sa saad õiged vastused õigesti tabelis ?

selle while sees muudaks ma nii asja:
$tulemus[$rida["asi"]] = $rida["kokku"];
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 12.01.2008 10:58:28 vasta tsitaadiga

Ma juba hakkan hullumeelselt naerma selle peale, sest seekord sain kõik väärtused 0 (nullid!) icon_lol.gif
Variandid, mida seal while() sees proovisin:
$mitusinul = $tulemus["id"];
$mitusind = $tulemus["id"];
$mitusinutp = $tulemus["id"];
$mitusindtp = $tulemus["id"];
// kõik nullid!

$mitusinul = $rida["kokku"]["id"];
$mitusind = $rida["kokku"]["id"];
$mitusinutp = $rida["kokku"]["id"];
$mitusindtp = $rida["kokku"]["id"];
// kõik nullid!

$mitusinul = $tulemus["asi"];
$mitusind = $tulemus["asi"];
$mitusinutp = $tulemus["asi"];
$mitusindtp = $tulemus["asi"];
// tühjus

$mitusinul = $tulemus["kokku"];
$mitusind = $tulemus["kokku"];
$mitusinutp = $tulemus["kokku"];
$mitusindtp = $tulemus["kokku"];
// tühjus

Üks variant veel ajas väärtusteks "id" ja seda 4 korda.
Mul on selline tunne, et ma teen midagi VÄGA valesti või ei olegi see päring üleüldse tehtav... icon_rolleyes.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
julmu
HV kasutaja
julmu

liitunud: 20.12.2004




sõnum 12.01.2008 12:35:57 vasta tsitaadiga

Õige lahendus on umbes selline:
php:
  1. $sql = mysql_query("SELECT count(*) AS kokku, 'mitusinul' AS asi FROM tabel1 where user_id='$sgm' AND x='0'
  2.       UNION
  3.       SELECT count(*), 'mitusind' FROM tabel1 where friend='$sgm' AND x='0'
  4.       UNION
  5.       SELECT count(*), 'mitusinutp' FROM tabel2 where user_id='$sgm'
  6.       UNION
  7.       SELECT count(*), 'mitusindtp' FROM tabel2 where friend_id='$sgm'");
  8.  
  9. while($rida = mysql_fetch_assoc($sql)){
  10.       $$rida["asi"] = $rida["kokku"];
  11. }


$$xxx tähendab, et tehakse uus muutuja, mille nimeks on $xxx väärtus.
Näiteks kui:
$xxx = 'yyy';

siis
$$xxx = 6;

tähendab, et tehakse uus muutuja
$yyy

mille väärtuseks on 6
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 12.01.2008 12:53:15 vasta tsitaadiga

ehk tulemus peaks olema siis et genereeritakse 4 muutujat: $mitusinul, $mitusind, $mitusinutp ja $mitusindtp ?
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 12.01.2008 14:08:41 vasta tsitaadiga

mikk36 kirjutas:
ehk tulemus peaks olema siis et genereeritakse 4 muutujat: $mitusinul, $mitusind, $mitusinutp ja $mitusindtp ?

Just, kõigil neljal muutujal peab olema oma väärtus.
Nüüd sain väikese edu, aga tulemus on veel olematu:
$sql = mysql_query("SELECT count(*) AS kokku, 'id' AS asi FROM tabel1 where user_id='$sgm' AND x='0'
      UNION
      SELECT count(*), 'id' FROM tabel1 where friend='$sgm' AND x='0'
      UNION
      SELECT count(*), 'id' FROM tabel2 where user_id='$sgm'
      UNION
      SELECT count(*), 'id' FROM tabel2 where friend_id='$sgm'");

while($rida = mysql_fetch_assoc($sql)){
$$rida["asi"] = $rida["kokku"];

$mitusinul = $rida["kokku"][0];
$mitusind = $rida["kokku"][1];
$mitusinutp = $rida["kokku"][2];
$mitusindtp = $rida["kokku"][3];

echo "t: ".$rida["kokku"];
}

See echo seal lõpus kuvas nii: t: 20t: 17t: 2t: 0 - ehk siis õiged arvud, aga need arvud ei lähe kuidagi muutujatesse, mis on selle echo ees! Muutujad on ikka kõik tühjad, esimne vaid on 0.

EDIT:
Kui [0] jms. aemele panin ["asi"], siis olid kõik 0, aga echo jäi muutumatuks.
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Valdars
HV veteran
Valdars

liitunud: 22.02.2003




sõnum 12.01.2008 14:09:57 vasta tsitaadiga

Kui echo töötas õieti, siis ei saanudki muutujatesse midagi minna, kuna echod ühemõõtmelise massiivi üht väärtust aga muutujatesse proovid panna kahemõõtmelist. Tee prooviks "print_r($rida);" seal echo asemel ja pane tulemus siia.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 45
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 12.01.2008 14:12:12 vasta tsitaadiga

Valdars kirjutas:
Kui echo töötas õieti, siis ei saanudki muutujatesse midagi minna, kuna echod ühemõõtmelise massiivi üht väärtust aga muutujatesse proovid panna kahemõõtmelist. Tee prooviks "print_r($rida);" seal echo asemel ja pane tulemus siia.

Array ( [kokku] => 20 [asi] => id ) Array ( [kokku] => 17 [asi] => id ) Array ( [kokku] => 2 [asi] => id ) Array ( [kokku] => 0 [asi] => id )
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 12.01.2008 14:19:35 vasta tsitaadiga

SGM, tundub et sa ei saa hetkel while tööpõhimõttest aru
while töötab korduvalt niikaua kuni tema () vahel olev annab false tulemuse
hetkel siis määratakse $mitusinul muutujasse sul esimene kord 2x, teine kord 1x väärtust, $mitusind muutujale antakse esimene kord 1x väärtus, teine kord 2x jne
korja need oma käsitsi lisatud read ära sealt ja proovi julmu viimati antud koodi

kui tahad debugida ning aru saada mis väärtused mis ajal mida omavad, siis tee nii:
enne while'i määra ära $i, pane väärtuseks 0
while'i sees echod $i väärtuse, $rida['asi'] ning $rida['kokku']väärtuse ja siis suurendad $i väärtust ühe võrra
näiteks

php:
  1. $sql = mysql_query("SELECT count(*) AS kokku, 'mitusinul' AS asi FROM tabel1 where user_id='$sgm' AND x='0'
  2.       UNION
  3.       SELECT count(*), 'mitusind' FROM tabel1 where friend='$sgm' AND x='0'
  4.       UNION
  5.       SELECT count(*), 'mitusinutp' FROM tabel2 where user_id='$sgm'
  6.       UNION
  7.       SELECT count(*), 'mitusindtp' FROM tabel2 where friend_id='$sgm'");
  8.  
  9. $i = 0;
  10. while($rida = mysql_fetch_assoc($sql)){
  11.       echo $i."<br>";
  12.       echo "asi:".$rida['asi']."<br>";
  13.       echo "kokku:".$rida['kokku']."<br><br>";
  14.       $i++;
  15. }


ning kuna sa jõudsid mainida et need praegused nimed asjadel on väljamõeldised ja reaalselt sa ei taha neid nimedena kasutada, siis on mõttekas määrata asja tulemus ühte muutujasse array'sse kasutades siis $tulemus[]["nimi"] = $rida["asi"]; ja $tulemus[]["kokku"] = $rida["kokku"]; omistamist
siis saad array, kus sul on $tulemus[0]["asi"] väärtuseks asja nimi ning $tulemus[0]["kokku"] väärtuseks asja koguarv

php:
  1. $sql = mysql_query("SELECT count(*) AS kokku, 'mitusinul' AS asi FROM tabel1 where user_id='$sgm' AND x='0'
  2.       UNION
  3.       SELECT count(*), 'mitusind' FROM tabel1 where friend='$sgm' AND x='0'
  4.       UNION
  5.       SELECT count(*), 'mitusinutp' FROM tabel2 where user_id='$sgm'
  6.       UNION
  7.       SELECT count(*), 'mitusindtp' FROM tabel2 where friend_id='$sgm'");
  8.  
  9. while($rida = mysql_fetch_assoc($sql)){
  10.       $tulemus[]["nimi"] = $rida["asi"];
  11.       $tulemus[]["kokku"] = $rida["kokku"];
  12. }


viimati muutis mikk36 12.01.2008 14:25:05, muudetud 1 kord
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 12.01.2008 14:23:34 vasta tsitaadiga

Sealt tuli nii:

0
asi:id
kokku:20

1
asi:id
kokku:17

2
asi:id
kokku:2

3
asi:id
kokku:0

Aga julmu koodis on mu muutujate nimed pandud andmebaasi tulpade nimedeks! Mul selliseid pole, mul vaid 'id' 4 korda...
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 12.01.2008 14:26:53 vasta tsitaadiga

hm, nüüd siis küsimus et millest see 4x "id" tekib, kokku tulemused saad sa õieti kätte
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 12.01.2008 14:36:20 vasta tsitaadiga

mikk36 kirjutas:
hm, nüüd siis küsimus et millest see 4x "id" tekib, kokku tulemused saad sa õieti kätte
Hetkel jäi mul kood selline:
php:
  1. $sql = mysql_query("SELECT count(*) AS kokku, 'id' AS asi FROM tabel1 where user_id='$sgm' AND x='0'
  2.       UNION
  3.       SELECT count(*), 'id' FROM tabel1 where friend='$sgm' AND x='0'
  4.       UNION
  5.       SELECT count(*), 'id' FROM tabel2 where user_id='$sgm'
  6.       UNION
  7.       SELECT count(*), 'id' FROM tabel2 where friend_id='$sgm'");
  8.  
  9.  
  10. $i = 0;
  11.  
  12. while($rida = mysql_fetch_assoc($sql)){
  13.       echo $i."<br>";
  14.       echo "asi:".$rida['asi']."<br>";
  15.       echo "kokku:".$rida['kokku']."<br><br>";
  16.       $i++;
  17. }

Aga need 4 erinevat arvu on mul vaja järjest anda 4-le muutujale:

$mitusinul
$mitusind
$mitusinutp
$mitusindtp

Kuidagi üle mõistuse käib see hetkel... Ega siis ilmaasjata ei öelda, et kujundajad ja progejad peavad olema eri isikud, sest ühel isikul tavaliselt on vaid üks külg tugev.
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online
sõnum 12.01.2008 14:42:14 vasta tsitaadiga

SGM kirjutas:
mikk36 kirjutas:
hm, nüüd siis küsimus et millest see 4x "id" tekib, kokku tulemused saad sa õieti kätte
Hetkel jäi mul kood selline:
php:
  1. $sql = mysql_query("SELECT count(*) AS kokku, 'id' AS asi FROM tabel1 where user_id='$sgm' AND x='0'
  2.       UNION
  3.       SELECT count(*), 'id' FROM tabel1 where friend='$sgm' AND x='0'
  4.       UNION
  5.       SELECT count(*), 'id' FROM tabel2 where user_id='$sgm'
  6.       UNION
  7.       SELECT count(*), 'id' FROM tabel2 where friend_id='$sgm'");
  8.  
  9.  
  10. $i = 0;
  11.  
  12. while($rida = mysql_fetch_assoc($sql)){
  13.       echo $i."<br>";
  14.       echo "asi:".$rida['asi']."<br>";
  15.       echo "kokku:".$rida['kokku']."<br><br>";
  16.       $i++;
  17. }

Aga need 4 erinevat arvu on mul vaja järjest anda 4-le muutujale:

$mitusinul
$mitusind
$mitusinutp
$mitusindtp

Kuidagi üle mõistuse käib see hetkel... Ega siis ilmaasjata ei öelda, et kujundajad ja progejad peavad olema eri isikud, sest ühel isikul tavaliselt on vaid üks külg tugev.
no kui sind see $rida["asi] üldse ei huvita, siis pole mõtet seda isegi query'sse panna
väljasta ainult endale tähtis info

php:
  1. $sql = mysql_query("SELECT count(*) AS kokku FROM tabel1 where user_id='$sgm' AND x='0'
  2.       UNION
  3.       SELECT count(*) FROM tabel1 where friend='$sgm' AND x='0'
  4.       UNION
  5.       SELECT count(*) FROM tabel2 where user_id='$sgm'
  6.       UNION
  7.       SELECT count(*) FROM tabel2 where friend_id='$sgm'");
  8.  
  9. while($rida = mysql_fetch_assoc($sql)){
  10.       $tulemus[] = $rida["kokku"];
  11. }
  12. $mitusinul = $tulemus[0];
  13. $mitusind = $tulemus[1];
  14. $mitusinutp = $tulemus[2];
  15. $mitusindtp = $tulemus[3];
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja
SGM

liitunud: 04.12.2005



Autoriseeritud ID-kaardiga
sõnum 12.01.2008 15:30:24 vasta tsitaadiga

hahaha! icon_lol.gif
Nii palju jama ja õiendamist - lõpuks oli asi ikkagi lihtne ja hakkas tööle õigesti! icon_biggrin.gif Tänud!

Nagu ma aru sain, läheb neid $rida["asi] teemasid vaja siis, kui on vaja ka andmeid kätte saada? Mul üks teine lehekülg samuti 4 päringuga, kuna ei osanud kõike ühe päringu sisse toppida. Seal see piltide info. Kõik ühest ja samast tabelist, aga eri nurga alt, eri parameetrite põhjal 4 pildi ID ja faili nimi välja sikutada. Sellest oli ka kusagil siin 1 teema vist...
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  abi vaja: mysql JOIN (?) mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.