zakerny problem so SQL
21 příspěvků
Archiv diskusního fóra
Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.
-
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>