Pereiti prie turinio

Sql dvigubas LIMIT iš dviejų lentelių, įmanoma?


Rekomenduojami pranešimai

Aišku, temos pavadinimas skamba netiksliai ir gan painiai, bet situacija tokia: yra dvi lentelės iš kurių reikia paimti duomenis pagal tam tikrus kriterijus ir limituoti juos. Viską ko gero daryčiau kitaip jei išmanyčiau tą sql, bet dabar tenka naudotis kažkieno parašytų kodu ir kažką burt, jis atrodo taip:

 

$dow = @mysql_query("SELECT rating_item_id, rating_type, rating_datestamp, COUNT(rating_datestamp) as kiekbalsavo, COUNT(rating_datestamp) / 3 + AVG(rating_vote) as viso, AVG(rating_vote) as vidurkis from ".DB_RATINGS." WHERE rating_type='F' group by rating_item_id order by viso DESC LIMIT 0,100");

$n = 0;
while ($q = @mysql_fetch_array($dow))
{
$n++;
$rating_item_id = $q['rating_item_id'];
$vidurkis = round($q['vidurkis'], 2);
$kiekbalsavo = $q['kiekbalsavo'];

$result = dbquery("SELECT * FROM ".$db_prefix."downloads WHERE download_cat = '1' AND download_submit = '0' AND download_id = '$rating_item_id' LIMIT 15");

 

Viskas būtų kaip ir gerai, bet antrasis LIMIT atributas neveikia, pirmas suveikia, paima tą šimtą, bet kai jau iš to šimto reikia atrinkti dar 15 - komanda tiesiog ignoruojama ir įmamas tas pirminis šimtas be jokio antro limito.

 

Gal kas turi idėjų kaip tai galėčiau padaryt, o gal kodas neteisingas, kad galėčiau taip priburt?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Šiaip noriu spausdint tik tą 15, bet esmė, kad tuos rezultatus atrinkinėju pagal kelis kriterijus, pirmi kriterijai iš vienos lentelės ".DB_RATINGS." ir iš ten gaunu tą 100, tada dar syk noriu prafiltruot pagal dar kitus kriterijus iš lentelės downloads ir gaut tą 15.

 

Aišku, norėčiau viską daryt paprasčiau, kad iškart ta pirmoji sql sintaksė atrinktų rezultatus pagal visus norimus kriterijus ir nereiktų čia dviejų LIMIT naudot, bet nemoku :(

Nuoroda į pranešimą
Dalintis kituose puslapiuose

$dow = @mysql_query("SELECT rating_item_id, rating_type, rating_datestamp, COUNT(rating_datestamp) as kiekbalsavo, COUNT(rating_datestamp) / 3 + AVG(rating_vote) as viso, AVG(rating_vote) as vidurkis from ".DB_RATINGS." WHERE rating_type='F' AND download_cat='1' AND download_submit='0' AND download_id='$rating_item_id' group by rating_item_id order by viso DESC LIMIT 0,15");

 

Šitą vietoj pirmosios eilutės dėk, o to kito tikrinimo nereikia ir turėtų veikti manau

 

EDIT: blogas šitas kodas...

Redagavo gidasss2
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Čia išvis tutėtų būti vieną užklausą su table`ų jungimu. O ne penkiasdešimt užklausų ir ciklai, kurie duoda tik apkrovą.

 

Na tai prašom parašyk tai kodu. Žmogus sakė nelabai moka mysql, aš irgi minimaliom žiniom ir apie mysql kodo optimizavimą tikrai nieko nežinau.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

O tai palauk, kokiu tikslu atrinkti 100 ir iš jo dar 15, jei gali iškarto 15?

 

Nu žmogus logiškai galvojo, bet ne programavimui pritaikyta logika. Jis galvojo kad reikia atrinkti 100 pagal vienus kriterijus ir poto iš to 100 dar 15 pagal kitus kriterijus. O programavime visus kriterijus surašai iškarto ir išrenki 15 rezultatų.

 

pirmi kriterijai iš vienos lentelės ".DB_RATINGS."

dar kitus kriterijus iš lentelės downloads

 

Taip kad pats norėdamas gudriai padaryti padariau klaidą, nes čia iš skirtingų lentelių filtrus daro. My bad...

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Bandžiau viską sukišt į vieną:

SELECT download_cat, rating_item_id, rating_type, rating_datestamp, COUNT(rating_datestamp) as kiekbalsavo, COUNT(rating_datestamp) / 3 + AVG(rating_vote) as viso, AVG(rating_vote) as vidurkis from ".$db_prefix."downloads AND ".DB_RATINGS.", ".$db_prefix."downloads WHERE rating_type='F' AND download_cat = '1' group by rating_item_id order by viso DESC LIMIT 0,15

 

Bet tada išvis jokių rezultatų :D

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Bandžiau viską sukišt į vieną:

SELECT download_cat, rating_item_id, rating_type, rating_datestamp, COUNT(rating_datestamp) as kiekbalsavo, COUNT(rating_datestamp) / 3 + AVG(rating_vote) as viso, AVG(rating_vote) as vidurkis from ".$db_prefix."downloads AND ".DB_RATINGS.", ".$db_prefix."downloads WHERE rating_type='F' AND download_cat = '1' group by rating_item_id order by viso DESC LIMIT 0,15

 

Bet tada išvis jokių rezultatų :D

o lenteles ne kableliu reik atskirt? pas tave and kaip matau.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

per phpmyadmin pabandyk paleist užklausą. gal errorus savo kode paslėpęs esi.

 

Su šiuo kodu:

SELECT download_cat, rating_item_id, rating_type, rating_datestamp, COUNT(rating_datestamp) as kiekbalsavo, COUNT(rating_datestamp) / 3 + AVG(rating_vote) as viso, AVG(rating_vote) as vidurkis FROM downloads, ratings WHERE rating_type='F' AND download_cat = '1' group by rating_item_id order by viso DESC LIMIT 0,15 

 

gaunu tokį #1046 - No database selected

 

Papastink savo "downloads" ir "ratings" lentelių struktūrą, gal bendrom jėgom padarysim normalų JOIN :)

 

Download struktūra:

download_id 	download_title 	download_description 	download_url 	download_cat 	download_license 	download_os 	download_version 	download_filesize 	download_datestamp 	download_count 	download_count_today 	download_status 	download_author 	download_description_p 	download_system 	download_allow_comments 	download_allow_ratings 	download_allow_recommends 	download_access 	mirror_url 	download_lang 	download_rus 	download_forum 	download_screen 	download_button 	download_burl 	download_background 	download_submit 	download_user 	download_count_s 	download_count_m

 

Ratings struktūra:

rating_id 	rating_item_id 	rating_type 	rating_user 	rating_vote 	rating_datestamp 	rating_ip

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...