MySQL SELECT a zoradenie podľa druhej tabuľky

Programovacie jazyky, rady, poradňa...
DjBass
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2068
Registrovaný: 24 máj 2008, 13:07
Bydlisko: Košice
Kontaktovať používateľa:

MySQL SELECT a zoradenie podľa druhej tabuľky

Príspevok od používateľa DjBass »

Zdravím,
Mám dve tabuľky. V jednej mám obsah a v druhej hodnotenia.

Povedzme, že prvá tabuľka "ludia" obsahuje stĺpce: id, meno, priezvisko, pohlavie.

Kód: Vybrať všetko

id             meno             priezvisko             pohlavie
1              Jozef            Novak                  muz
2              Maria            Novakova               zena
3              Marian           Cibula                 muz
Z tejto tabuľky potrebujem získať celý obsah (pohlavie muž), teraz používam niečo takéto... Momentálne sa výsledky zoraďujú podľa id, čo by som potreboval zmeniť.

Kód: Vybrať všetko

SELECT * FROM ludia WHERE pohlavie='muz' ORDER BY id DESC LIMIT 0,10;
Mám druhú tabuľku "hodnotenia", ktorá má stĺpce id, stav_teraz, stav_celkom...

Kód: Vybrať všetko

id             stav_teraz             stav_celkom
1              5                      10
2              2.35                   7
3              5                      15
No a ja vlastne potrebujem, aby mi vybralo záznamy z tabuľky "ludia" a zoradilo ich podľa bodov v tabuľke "hodnotenia" (od najväčšieho po najmenšie). Najprv by sa bral do úvahy stĺpec "stav_teraz" a ak by sa vyskytovalo viac s rovnakou hodnotou, tak by sa bral do úvahy aj stĺpec "stav_celkom".

Z uvedeného príkladu by sa, teda, zobrazil ako prvý Marian a ako druhý Jozef.

Nevedeli by ste mi s tým pomôcť? Ďakujem...
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: MySQL SELECT a zoradenie podľa druhej tabuľky

Príspevok od používateľa audiotrack »

Kód: Vybrať všetko

select ludia.* from ludia left join hodnotenia on ludia.id = hodnotenia.id order by hodnotenia.stav_teraz, stav_celkom
DjBass
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2068
Registrovaný: 24 máj 2008, 13:07
Bydlisko: Košice
Kontaktovať používateľa:

Re: MySQL SELECT a zoradenie podľa druhej tabuľky

Príspevok od používateľa DjBass »

Takže mám tu ďalší problém... pri malom obsahu druhej tabuľky všetko fungovalo OK a rýchlo, no čím viac bolo v nej údajov, tým pomalšie sa dáta vyberajú. Momentálne je v oboch tabuľkách cca 1600 riadkov...

Používam zápis v presne takomto tvare a na úvodnej stránke mám takéto dopyty 3, čím sa stránka načítava veľmi dlho...

Kód: Vybrať všetko

SELECT omfg_sekcie.* FROM omfg_sekcie LEFT JOIN ratings ON omfg_sekcie.id = ratings.id WHERE omfg_sekcie.sekcia='vtipy' ORDER BY ratings.current DESC, ratings.total_votes DESC LIMIT 0,10;
Pri spustení dopytu cez phpMyAdmin mi napíše toto... čo je neprijateľný čas...
Ukázať záznamy 0 - 9 ( 10 celkovo, Dopyt zabral 10.0238 sek.)
Neviete mi pomôcť ako by som tento problém mohol vyriešiť? Napadlo ma vyhodnocovať tieto údaje bokom cez cron a zapísať ich do nejakej inej tabuľky, z ktorej by sa potom tie dáta zobrazovali a dopyt sa nemusel vyhodnocovať toľko krát. Existuje nejaké iné/lepšie riešenie? Ďakujem..
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: MySQL SELECT a zoradenie podľa druhej tabuľky

Príspevok od používateľa audiotrack »

namiesto omfg_sekcie.* použi vypísanie stlpcov ktoré ti treba, neber celú tabuľku ak ti ju netreba. Lenivosť spôsobuje pomalosť. Taktiež by si si mal porobiť indexy, minimálne na kľúče na ktorých sa spája, čiže omfg_sekcie.id a ratings.id. V extrémnom prípade by sa dal spraviť hash index na omfg_sekcie.sekcia a tiež sa zamysli nad tým, či sa tie tri query čo tam máš nedajú spojiť do jedného
DjBass
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2068
Registrovaný: 24 máj 2008, 13:07
Bydlisko: Košice
Kontaktovať používateľa:

Re: MySQL SELECT a zoradenie podľa druhej tabuľky

Príspevok od používateľa DjBass »

To bolo prvé, čo som skúšal, no vtedy to vôbec nepomohlo. Teraz mi tento dopyt vykoná za cca 0,5sek, s vypísaním stĺpcov cca 0,4sek, takže to trochu pomohlo. Na omfg_sekcie.id a takisto na ratings.id je vytvorený PRIMARY index, treba niečo spraviť inak? Tie 3 query sú tam na vypísanie 3 rôznych zoznamov, ktoré sa vyberajú rovnakým zápisom, len sa líšia v omfg_sekcie.sekcia...
Blade.m
Medium Star
Medium Star
Príspevky: 454
Registrovaný: 06 apr 2007, 20:10
Bydlisko: Čadca

Re: MySQL SELECT a zoradenie podľa druhej tabuľky

Príspevok od používateľa Blade.m »

neviem ci dobre poradim, ale vsak za vyskusanie nic nedas :)...skus toto:

Kód: Vybrať všetko

SELECT ludia.* FROM ludia, hodnotenia WHERE ludia.id = hodnotenia.id ORDER BY hodnotenia.stav_teraz, hodnotenia.stav_celkom DESC;
DjBass
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2068
Registrovaný: 24 máj 2008, 13:07
Bydlisko: Košice
Kontaktovať používateľa:

Re: MySQL SELECT a zoradenie podľa druhej tabuľky

Príspevok od používateľa DjBass »

Ďakujem, takýto zápis mi funguje oveľa rýchlejšie.
Ukázať záznamy 0 - 9 ( 10 celkovo, Dopyt zabral 0.0021 sek.)

Kód: Vybrať všetko

SELECT omfg_sekcie.id, nazov, id_kto
FROM omfg_sekcie, ratings
WHERE omfg_sekcie.id = ratings.id
AND omfg_sekcie.sekcia = 'vtipy'
ORDER BY ratings.current DESC , ratings.total_votes DESC
LIMIT 0 , 10
Napísať odpoveď