Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Neaktivní uživatel:5.2.2014 19:22

Zdravím,

mám dvě tabulky. V jedné mám data s "předměty" a v druhé mám hodnocení uživatelů na tyto předměty. Druhá tabulka je zařízena tak, že každý řádek znamená hodnocení jednoho uživatele.
Teď bych ale potřeboval vytáhnout nejlépe hodnocené "předměty". Prvně jsem chtěl udělat SELECT dotaz pro každý předmět, ale to by dotazů bylo příliš a nebylo by to zrovna nejrychlejší.
Pak mě napadlo při každém hodnocení uložit i do první tabulky políčko "Hodnocení". Aktualizovalo by se při každém novém hodnocení a snadno by se to tahalo z tabulky.

Jaký na to máte názor vy? Jak bych to měl udělat?

Odpovědět
5.2.2014 19:22
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:6.2.2014 7:47

Teď mě ještě napadá, že by to šlo dotazem.

Mám tyto řádky:

id: 1, name: Blabla, item: 1
id: 2, name: Blabla 2, item: 1
id: 3, name: Blabla 3, item: 2

A potřebuju získat řádky s největším počtem jednoho ID item. V tomto případě první dva řádky, protože jsou dva, zatímco item 2 je jen jeden. Šlo by to nějak?

Nahoru Odpovědět
6.2.2014 7:47
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:6.2.2014 9:24

Mělo by jít něco jako:

SELECT *
FROM predmet
JOIN hodnoceni USING (predmet_id)
GROUP BY predmet_id ORDER BY body DESC
Nahoru Odpovědět
6.2.2014 9:24
You are the greatest project you will ever work on.
Avatar
Neaktivní uživatel:6.2.2014 10:01
| id    |series | author | value |
|--------------------------------|
| 5     | 2     | 1      | 5     |
| 6     | 2     | 8      | 4     |
|--------------------------------|

Problém je, že tabulka s hodnocením vypadá nějak takto a ten předmět má tedy víc hodnocení od různých uživatelů.

Editováno 6.2.2014 10:02
Nahoru Odpovědět
6.2.2014 10:01
Neaktivní uživatelský účet
Avatar
Paul
Člen
Avatar
Odpovídá na Neaktivní uživatel
Paul:6.2.2014 10:22

Jestli tě správně chápu, šlo by to udělat pomocí vnořenýho dotazu. Vyber všechno z tabulky XXX kde item = (Vyber item, který se v tabulce YYY objevuje nejvíckrát).

 
Nahoru Odpovědět
6.2.2014 10:22
Avatar
Odpovídá na Paul
Neaktivní uživatel:6.2.2014 10:56

Ono ale bohužel nejde o to, kolikrát se objeví, ale o průměr sloupce value.

soucet_value / pocet_prvku

Dalo by se to nějak udělat v MySQL?

Nahoru Odpovědět
6.2.2014 10:56
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:6.2.2014 11:22

Česky by ten příkaz zněl asi takto: Vyber pět řádků z tabulky series, které mají největší průměrné hodnocení z tabulky ranking.

Nahoru Odpovědět
6.2.2014 11:22
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:6.2.2014 12:11

Vždyť jsem ti psal jak to udělat.

Nahoru Odpovědět
6.2.2014 12:11
You are the greatest project you will ever work on.
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:6.2.2014 12:17

Ano, ale tvoje řešení nepočítá s nevyšší průměrnou hodnotou. Nebo počítá a já to tam nevím, to se pak omlouvám. :)

Nahoru Odpovědět
6.2.2014 12:17
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:6.2.2014 12:45

Nic o průměru jsi v dotazu nepsal. Si to uprav, každopádně budeš používat GROUP BY.

Nahoru Odpovědět
6.2.2014 12:45
You are the greatest project you will ever work on.
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:6.2.2014 13:00

Na MySQL nejsem moc zručný. Můžeš mi ukázat, jak by to mohlo vypadat?

Nahoru Odpovědět
6.2.2014 13:00
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Nymsa:6.2.2014 13:06

Průměr máš pomocí funkce AVG(). Stačí trošku pročíst dokumentaci, navíc i zde to je popsané

Nahoru Odpovědět
6.2.2014 13:06
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:6.2.2014 13:07

Já taky ne :P Nějak takhle by to mohlo jít:

SELECT predmet_id, AVG(body) as prumer
FROM predmet
JOIN hodnoceni USING (predmet_id)
GROUP BY predmet_id
ORDER BY prumer DESC
LIMIT 10;
Nahoru Odpovědět
6.2.2014 13:07
You are the greatest project you will ever work on.
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:6.2.2014 13:17

Díky, už se si začal zavařovat mozek. :D

Nahoru Odpovědět
6.2.2014 13:17
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:6.2.2014 13:34

Není zač, alespoň jsem si ho taky provařil, je to zdravý :D

Nahoru Odpovědět
6.2.2014 13:34
You are the greatest project you will ever work on.
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:6.2.2014 13:48

:D Asi si znova přečtu něco o SQL, tohle mě vystrašilo. :D

Nahoru Odpovědět
6.2.2014 13:48
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.