Autor Zpráva
charlie22
Profil *
Zdravím, trapim se tady s dotazem do databaze. Kicem je identifikator uzivatele. Ten ma v databazi X zaznamu. Potrebuji vybrat jen 3 zaznamy a to od kazdeho uizvatele. Pouziti limit mi samozrejme vybere jen 2 zaznamy, ale jen pro jednoho uzivatele, pokud mam setrideno podle uzivatelu. Ma nekdo poneti, jak by to melo vypadat?


DATA:
USER1, 8
USER1, 5
USER1, 2
USER1, 1
USER1, NULL

USER2, 5
USER2, 2
USER2, 1
USER2, 0


VYSLEDEK:
USER1, 5
USER1, 2
USER2, 5
USER2, 2


V nejlepsím pripade bych jeste do sloupce 3 potreboval sumu tech 2 polozek..Diky za tipy predem.
charlie22
Profil *
samozrejme vysledek ma byt takovyhle:
USER1, 8
USER1, 5
USER2, 5
USER2, 2
Kajman_
Profil *
Co třeba ořezat výsledek z group_concat? Ale to by bylo jen jeden řádek pro každého uživatele.

Na další možnost se zkuste inspirovat zde
http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=28&topic=79886#2
Jen to nebude fungovat správně, pokud ta kombinace dvou sloupečků není primární klíč (což asi není, když tam máte null hodnoty).
charlie22
Profil *
no uz jsem denska asi pretazenej..
charlie22
Profil *
tak zatím se mi to přímou cestou nepodařilo vyřešit a mám pocit, že MySQL je na tohle krátky. Vypadá to tak, že to musím celý nacucnout do nejakýho pole v PHP a pak zapsat nejakou TEMP tabulku jen se X záznamy od každýho unkátního usera. Nebo se pletu?
Kajman_
Profil *
A tohle dnešní vlákno také k inspiraci nepomůže?
http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=28&topic=89193#4
charlie22
Profil *
...nic, nechytam se, ale zjednodussim zadani, protoze ani tohle nejsem schopen:
Tabulka:
User:
Pavel
Pavel
Pavel
Pavel
Petr
Petr
Petr
Dan


select by mel vybrat maximalne kazde jmeno 2x.

Vysledek:
User:
Pavel
Pavel
Petr
Petr
Dan
Kajman_
Profil *
Ale to jste právě udělal těžší. U těch odkazovaných řešení je nutné, aby tam bylo možné jednoznačné seřazení pro určení těch dvou záznamů. Dokud tam nebudete mít primární klíč, tak to řešení na úrovní sql mít nemusí.

K té první struktuře je nutné dát spíše další sloupeček, který jednoznačně určí, který záznam se bude brát, když budou třeba tři hodnoty u jednoho uživatele stejné. Když Vám nestačí obecné rady a ukázkové příklady, tak alespoň napište opravdovou strukturu tabulky, co má primární klíč.

Ale vlastně bez toho klíče je ještě v mysql jeden způsob. Dá se využít uživatelské proměnné. To by možná bylo z těch různých řešení možná nejméně náročné na db stroj.
charlie22
Profil *
se omlouvam, samozrejme jsem zapmnel uvest ze Prim key by byl autoincrement pro kazdy radek.
Kajman_
Profil *
Takže ukázka další varianty s uživatelskými proměnnými...

select k.*, @n:=@n*(@last_user=`user`)+1 n, @last_user:=`user` u 
from `tabulka` k, (select @n:=0, @last_user:='') t
having  n <=2
order by `user`, `body` desc


Pokud tam budou vadit ty dva pomocné sloupce navíc, tak si to zanořte a vypište to bez nich.
charlie22
Profil *
..pekny, ale na moje znalosti bych potreboval jeste mensi osvetu co je co, protoze pouziti uzivatelske promenne vidim poprve.
nejsou mi jasne hodnoty k,u,t, pokud n chapu jako definovane, ale jiste to nevim.
no mozna bych to potreboval prelozit do srozumitelne reci, co ten dotaz vykoná. Diky za trpelivost se mnou.
Kajman_
Profil *
pouziti uzivatelske promenne vidim poprve
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

nejsou mi jasne hodnoty k,u,t
k je alias tabulky tabulka
t je povinný alias pomocné tabulky vzniklé poddotazem a slouží pouze k inizializaci uživatelských proměnných
u je alias pomocného sloupečku, který je jen pro zapamatování posledního uživatele

pokud n chapu jako definovane, ale jiste to nevim
n je alias sloupečku, který určuje pořadí daného záznamu v rámci jednotlivých uživatelů
Tenhle sloupeček je ten, co to dokáže vybrat ty dva první záznamy. Přičítá po řádcích jedničky, ale když se uživatel změnil, tak začne odznovu.
charlie22
Profil *
pane, diky, vas dotaz funguje, jak jsem chtel a rovnou jsem se pustil do studia uzivatelskych promennych..diky mnohokrat za rady.
Toto téma je uzamčeno. Odpověď nelze zaslat.