zakerny problem so SQL

Robim katalog, a mam 2 tabulky... V jednej su ulozene weby a v druhej je hodnotenie tychto webov tak, aby kazdy mohol hodnotit len raz. Ale problem nastane, ake chcem zobrazit weby z tabulky 1 podla hodnotenia v tabulke 2.

Struktura tabulky weby:
CREATE TABLE `weby` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`url` VARCHAR(100) NOT NULL default '',
PRIMARY KEY (`id`)
);

a tabulky rate:
CREATE TABLE `weby` (
`id_webu` INT(11) NOT NULL default '0',
`ip` VARCHAR(10) NOT NULL default '',
`hodontenie` INT(11) NOT NULL default '',
PRIMARY KEY (`id`)
);

Pls, ako sa to da spravit?
select id, url, hodnotenie from weby join rate on weby.id = rate.id_webu order by hodnotenie
nevim jiste, jestli to pujde, ale zkusit se to muze
Jina varianta bez pouziti join:

SELECT weby.id, weby.url, rate.hodnotenie FROM weby,rate WHERE weby.id = rate.id_webu ORDER BY rate.hodnotenie
takovej join bez join.. ;)
Mozno ste zabudli na to, ze k jednemu webu moze byt napr. aj 50 hlasovani a z tychto hlasovani sa musi spravit priemer a podla toho to usporiadat... A myslim si, ze tato moznost nebude fungovat...
hmm? ako by sa to dalo spravit ked tam moze byt viac hlasovani pri jednom webe?
jo, to jsem si neuvedomil... no tak se tam asi prida avg a group by
SELECT id, url, AVG(hodnotenie) AS prumer FROM weby JOIN rate ON weby.id = rate.id_webu GROUP BY id, url ORDER BY prumer
Nejde to... Hlasi: #1052 - Sloupec 'id' v field list nen-B� zcela jasn�
Tu je struktura tabuliek ktore tam mam:

CREATE TABLE `weby` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`kat` VARCHAR(20) NOT NULL default '',
`heslo` VARCHAR(50) NOT NULL default '',
`majitel` VARCHAR(50) NOT NULL default '',
`email` VARCHAR(50) NOT NULL default '',
`url` VARCHAR(100) NOT NULL default '',
`nazov` VARCHAR(100) NOT NULL default '',
`popis` TEXT NOT NULL,
`top` INT(11) NOT NULL default '0',
PRIMARY KEY (`id`)
);

CREATE TABLE `rate` (
`id` INT(11) NOT NULL default '0',
`ip` VARCHAR(20) NOT NULL default '',
`cas` INT(11) NOT NULL default '0',
`znamka` INT(11) NOT NULL default '0'
);
Pak to bude SELECT weby.id, url, AVG(hodnotenie) AS prumer FROM weby JOIN rate ON weby.id = rate.id_webu GROUP BY id, url ORDER BY prumer
Ide to, ale treba aby to zobrazovalo aj take weby o nemaju zatial ziadne hodnotenie a aby to necitalo vsetky riadky z tabulky weby (tj. nazov, url, popis, atd) Da sa to spravit?
tak jako kdyz menis tabulky a nazvy sloupcu, musis prizpusobit i ten dotaz...
SELECT weby.id, url, dalsi_sloupce_z_weby_ktery_chces, AVG(znamka) AS prumer FROM weby JOIN rate ON weby.id = rate.id GROUP BY weby.id, url, dalsi_sloupce_z_weby_ktery_chces ORDER BY prumer
ok, a ako sa da spravit to, aby to zobrazovalo aj tie stranky ktore nemaju zatial ziadne hodnotenie?
SELECT weby.id, url, dalsi_sloupce_z_weby_ktery_chces, AVG(znamka) AS prumer FROM weby LEFT JOIN rate ON weby.id = rate.id GROUP BY weby.id, url, dalsi_sloupce_z_weby_ktery_chces ORDER BY prumer
udelas z toho vnejsi spojeni, ze tam pridas to LEFT pred JOIN
OK, moc diki... funguje to... Malo by tam byt sice este DESC kedze sa to ma zobrazovat od najvecsieho po nejmensie ale to si uz spravim...
Mam este jeden probelm... Mam tabulku pristupy kde su ulozene IN pristupy na katalog z webov. V tabulke sa uklada id webu na ktory sa odkazuje, cas, ip adresa a pocet pristupov. Ak sa odkaze na subor in.php, skontroluje sa web a ak za poslednyh 24 hodin sa uz z tej istej ip adresy na ten isty web uz odkazovalo, nestane sa nic, ale ak sa este neodkazovalo, pripocita sa k stlpcu pocet +1. Tu je struktura tej tabulky:

CREATE TABLE `pristupy` (
`id` INT(11) NOT NULL default '0',
`ip` VARCHAR(20) NOT NULL default '',
`pocet` INT(11) NOT NULL default '0',
`cas` INT(11) NOT NULL default '0'
);

Mam ale problem, ked sa ma v zozname webov v katalogu zoradovat podla tycho IN pristupov. Musia sa spocitat vsetky stlpce pocet pre urcite id webu a zoradit tie weby podla toho kto ma najviac celkovych pristupov. Je to neco ako na top.er.cz Ako by sa to dalo spravit?
Vlastne teraz ide o to ze sa nebude robit priemer vsetkych hlasovani, ale sa spocitaju vsetky pristupy a zoradi sa to od najvecsieho po nejmensie
vsak to je to stejny:
SELECT weby.id, url, dalsi_sloupce_z_weby_ktery_chces, SUM(pocet) AS celkem FROM weby LEFT JOIN pristupy ON weby.id = pristupy.id GROUP BY weby.id, url, dalsi_sloupce_z_weby_ktery_chces ORDER BY celkem DESC
pokud jsem to teda pochopil spravne...
Ako by sa to dalo?
<HTML>To co chces je klasicka situace resena spatnou a pomalou cestou.
Optimalizovany zpusob sebou nese i reseni.

Pokud to dobre chapu tak rekneme 100x si nekdo prohledne hodnoceni ale jen 1x hodnoti (vuci poctu zobrazeni) to je pomer 100:1 zbytecne vykonanych slozitych dotazu.

Takze:
CREATE TABLE `weby` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`kat` VARCHAR(20) NOT NULL default '',
`heslo` VARCHAR(50) NOT NULL default '',
`majitel` VARCHAR(50) NOT NULL default '',
`email` VARCHAR(50) NOT NULL default '',
`url` VARCHAR(100) NOT NULL default '',
`nazov` VARCHAR(100) NOT NULL default '',
`popis` TEXT NOT NULL,
`top` INT(11) NOT NULL default '0',
<b>`rate` float NOT NULL default '0',</b>

PRIMARY KEY (`id`)
);

- Pri kazdem hodnoceni zapises hlas do tbl. rate
- Zjistis prumer hodnoceni v tbl. rate odpovidajicimu webu
- Zapises do tbl. weby hodnoceni (do sloupce rate)

Pak kdyz budes radit neni potreba zadne join protoze hodnoceni mas hned v tabulce weby bez pocitacni. Tim se podstatne snizi zatez serveru,rychlost nacitani a zjednodusis reseni</HTML>
<HTML>Přesně tak - vždy je potřeba najít jistý kompromis mezi úsporou dat a úsporou procesorového času. Je mezi tím jistá zákonitost, co se spotřeby daných věcí týče:

Paměť × Procesor = Konstanta

Zde na WZ je prioritou procesor.</HTML>