SQL - zgrupenie s limitom

Programovacie jazyky, rady, poradňa...
sharky-no
King
King
Používateľov profilový obrázok
Príspevky: 1681
Registrovaný: 31 okt 2006, 19:53

SQL - zgrupenie s limitom

Príspevok od používateľa sharky-no »

Keby viem lepsie nazvat tento problem, tak si to vygooglim..

tak snad mi tu niekto pomoze.

mam tabulku s clankami, ktore mozu byt topovane, a su zaradene do kategorii..

ked chcem ziskat 3 top clanky pre danu kategoriu tak spravim jednoducho toto:

Kód: Vybrať všetko

     SELECT * FROM posts WHERE category_id = 1 AND top_post = 1 LIMIT 0,3 
Chcem vsak taku query, ktora mi vytiahne top 3 clanky pre kazdu kategoriu, s tym ze pocet kategorii nie je pevne dany (daju sa dynamicky vytvarat).

Cize nieco taketo, ale do jednej query:

Kód: Vybrať všetko

 SELECT * FROM posts WHERE category_id = 1 AND top_post = 1 LIMIT 0,3 
 SELECT * FROM posts WHERE category_id = 2 AND top_post = 1 LIMIT 0,3 
 SELECT * FROM posts WHERE category_id = 3 AND top_post = 1 LIMIT 0,3 
 ...
 SELECT * FROM posts WHERE category_id = 10 AND top_post = 1 LIMIT 0,3 
//autoeditácia príspevku (14 Sep 2014, 2:01)
hmm, tak nakoniec som nasiel nejake postupy, a vyslo mi z toho toto:

Kód: Vybrať všetko

   SELECT x.*
  FROM (SELECT t.*,
               CASE
                 WHEN @category != t.category_id THEN @rownum := 1
                 ELSE @rownum := @rownum + 1
               END AS rank,
               @category := t.category_id AS var_category
          FROM posts t
          JOIN (SELECT @rownum := NULL, @category := '') r
      WHERE t.top_post = 1 ORDER BY t.category_id ASC, t.top_post DESC, t.published_at DESC) x
 WHERE x.rank <= 3
Ak niekoho napada jednoduchsia verzia, tak privitam
(dolezite je tam aj to zotriedenie podla published_at, to som v prvom prispevku nespominal)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: SQL - zgrupenie s limitom

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

zabudol si napisat aku databazu pouzivas
sharky-no
King
King
Používateľov profilový obrázok
Príspevky: 1681
Registrovaný: 31 okt 2006, 19:53

Re: SQL - zgrupenie s limitom

Príspevok od používateľa sharky-no »

hej pardon, mysql 5.5

toto riesenie funguje a staci mi, este som ho trocha upravil a robi to co chcem...

to len cisto zo zaujimavosti som zvedavy, ze ci sa to da aj jednoduchsie
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: SQL - zgrupenie s limitom

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

odporucam to odtestovat na realnych datach,
ja som presne tot risiel pred troma rokmi, a podobny dopyt zavrazdil mysql, ale od vtedy sa toho mohlo vela zmenit....
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: SQL - zgrupenie s limitom

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

ono nie vždy je žiaduce minimalizovať počet query. Ak to má robiť takéto šialené query tak možno je fakt lepšie to rozdeliť do viacerých. Taktiež tam vyberáš prvé 3 top príspevky, čo mi nedáva zmysel. Väčší zmysel by mi dávalo vyberať náhodné z tých top alebo ich zoradiť podľa počtu topov ak sa dá topovať viackrát. Nie zobrať prvé tri čo boli napísané a majú top. To ti bude vždy vracať ten istý výsledok. Ale ak si presvedčený o tom že toto je to čo chceš, tak to môžeš cachovať lebo ten výsledok sa nebude takmer vôbec meniť (možno raz za pár dní ak niektorý post zmažeš a podobne)
sharky-no
King
King
Používateľov profilový obrázok
Príspevky: 1681
Registrovaný: 31 okt 2006, 19:53

Re: SQL - zgrupenie s limitom

Príspevok od používateľa sharky-no »

Nedal som uplne presnu query, beru sa samozrejme 3 top posty ktore su najnovsie, cize tam este je jedno orderby..

Kód: Vybrať všetko

SELECT * FROM posts WHERE category_id = 1 AND top_post = 1 ORDER BY published_at DESC LIMIT 0,3 
asi fakt bude robit problemy to riesenie, lebo to pocita rank kazdemu prispevku a nie len prvym trom..

idem to odsimulovat s nejakym vyssim poctom fake udajov a postnem rozdiel

//autoeditácia príspevku (15 Sep 2014, 12:41)
No na localhoste s 10 000 postami a 13 kategoriami (obe hodnoty su uz extrem, a ten web take hodnoty nikdy nebude mat) aj s upravou dat (vlozenie ich do objektu) vyhrala jednoduchsia verzia. (v prilohe)

Pri normalnom pocte 1000 postov, 7 kategorii su vsak obe verzie rovnocenne cca mi hadzu 13ms.

Tych 1000 postov sa dosiahne mozno za par rokov, ak vobec. Asi teda ponecham tuto zlozitejsiu verziu, budem mat lepsi pocit z toho ze sa nerobi na indexe 8SQL dotazov ked sa moze len 1. Aj tak zo zaciatku bude rychlejsia.
Prílohy
pri 10 000 postov a 13 kateg.
pri 10 000 postov a 13 kateg.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: SQL - zgrupenie s limitom

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

tych 8 dopytov pdola kategorie by si mal vediet stlacit do jedneho cez UNION

Kód: Vybrať všetko

(SELECT * FROM posts WHERE category_id = 1 AND top_post = 1 ORDER BY published_at DESC LIMIT 0,3)
UNION
(SELECT * FROM posts WHERE category_id = 2 AND top_post = 1 ORDER BY published_at DESC LIMIT 0,3)
UNION
....
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: SQL - zgrupenie s limitom

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

sharky-no: to tvoje meranie je zbytočné mrhanie časom, lebo si ním nič neoveril. Test jedného užívateľa na localhoste? To ako fakt? Myslíš že sa to bude rovnako správať na serveri s úplne inou konfiguráciou a keď tam príde viac ľudí? V tom query máš premenné, podmienky a plno drahých operácii. V reálnom svete nikdy nemôže byť tak efektívne, ako keby to bolo rozbité keď aj na tých 13 query. To už fakt potom radšej ten union čo harrison spomenul, len k nemu pribudne ešte jedno query aby si zistil počet kategorii nech to vieš v php vyskladať v cykle
sharky-no
King
King
Používateľov profilový obrázok
Príspevky: 1681
Registrovaný: 31 okt 2006, 19:53

Re: SQL - zgrupenie s limitom

Príspevok od používateľa sharky-no »

neslo mi o to aby som zistil casy, ktore budu online, ale aky PRIBLIZNE % rozdiel je v tych 2 query, trebars aj na locale. ako vravim, nemam problem vymenit jednu metodu za druhu.. pokial uvidim aky vlastne traffic bude mat ten startup, a ake casy budu pri loadovani webu, tak podla toho sa rozhodnem.
Napísať odpoveď