Portál AbcLinuxu, 3. listopadu 2025 11:46
SELECT R.cislo FROM polozka P, relace R, spolecne S WHERE P.typ=12 and P.cislo=R.potomek and typ_potomka='P' and S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now() ORDER BY S.vytvoreno DESC LIMIT 0,15Naivne jsem pridal do selectu sloupecek S.pridal, ktery obsahuje id autora, a doplnil
GROUP by S.pridal, coz zafungovalo, ale seznam nebyl setrizen podle casu. Klauzule DISTINCT take nema zadny efekt, protoze id relace je vzdy unikatni. Tim jsem uvizl a nez to zacnu resit v jave, poradim se s vami, zda na neco neprijdete.
with polozky as (
SELECT R.cislo, s.vytvoreno, s.pridal
FROM polozka P, relace R, spolecne S
WHERE P.typ=12
and P.cislo=R.potomek
and typ_potomka='P'
and S.typ='P'
and S.cislo=R.potomek
AND S.vytvoreno<=now()
)
select *
from polozky xx
where not exists ( select 0
from polozky
where pridal = xx.pridal
and vytvoreno > xx.vytvoreno )
Te javy bych se zas tak moc nebal, jestlize ted tahas 15, muzes tahat rekneme 30 a pokud by to nestacilo, dotahnout si dalsi - je to samozrejme pomalejsi, ale predpokladam, ze v 99% pripadu by se vystacilo s jednim dotazem.
... AS a INNER JOIN (SELECT MAX(vytvoreno) AS vytvoreno, pridal FROM spolecne) AS b ON (a.vytvoreno = b.vytvoreno AND a.pridal = b.pridal)
SELECT R.cislo
FROM
polozka P
INNER JOIN
relace R
ON (P.typ=12 and P.cislo=R.potomek and typ_potomka='P')
INNER JOIN
spolecne S
ON (S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now())
INNER JOIN
(
SELECT MAX(vytvoreno) AS vytvoreno, pridal FROM spolecne
WHERE S.typ = 'P' AND S.vytvoreno<=now()
GROUP BY pridal) AS U
ON (S.vytvoreno = U.vytvoreno AND S.pridal = U.pridal AND S.cislo = U.cislo))
ORDER BY S.vytvoreno DESC LIMIT 0,15
Nejak takto by to melo fungovat, inner joiny jsou v podstate identicke s puvodnim pouzitim where, akorat mi prijdou prehlednejsi. Mozna tam je nejaka chyba a nejspis by to bylo dobre nejak zoptimalizovat. No, uvidite.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY S.vytvoreno
Vice si pohraju vecer
ERROR 1054 (42S22): Unknown column 'S.typ' in 'where clause'coz resi odstraneni prefixu S. Pak to ale skonci na to, ze tabulka U nema sloupecek cislo:
Unknown column 'U.cislo' in 'on clause'
SELECT R.cislo
FROM
polozka P
INNER JOIN
relace R
ON (P.typ=12 and P.cislo=R.potomek and typ_potomka='P')
INNER JOIN
spolecne S
ON (S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now())
INNER JOIN
(
SELECT MAX(cislo) AS cislo, pridal FROM spolecne
WHERE typ = 'P' AND vytvoreno >= now()
GROUP BY pridal ) AS U
ON (S.pridal = U.pridal AND S.cislo = U.cislo)
ORDER BY S.vytvoreno DESC LIMIT 0,15
To vrati od kazdeho uzivatele vzdy pouze zaznamy s nejvyssim cislem typu 'P'.
Pokud cislo neni nejvyssi u nejnovejsiho zaznamu daneho typu (i kdyz asi je, kdyz je cislo + typ unikatni), pak se to musi hnat pres vytvoreno, ale to je hloupe, protoze nevim, zda je zajistena jedinecnost. v kazdem pripade takto:
SELECT R.cislo
FROM
polozka P
INNER JOIN
relace R
ON (P.typ=12 and P.cislo=R.potomek and typ_potomka='P')
INNER JOIN
spolecne S
ON (S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now())
INNER JOIN
(
SELECT MAX(vytvoreno) AS vytvoreno, pridal FROM spolecne
WHERE typ = 'P' AND vytvoreno >= now()
GROUP BY pridal ) AS U
ON (S.pridal = U.pridal AND S.vytvoreno = U.vytvoreno)
ORDER BY S.vytvoreno DESC LIMIT 0,15
S.Pridal.
SELECT S.pridal,MAX(R.cislo) AS cisloPosledni,MIN(R.cislo) AS cisloPrvni FROM relace AS R INNER JOIN polozka AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=now() GROUP BY S.pridal ORDER BY S.vytvoreno DESC LIMIT 0,15Což by mohlo být původní
SELECT S.pridal,MAX(R.cislo) AS cisloPosledni,MIN(R.cislo) AS cisloPrvni FROM polozka P, relace R, spolecne S WHERE P.typ=12 and P.cislo=R.potomek and typ_potomka='P' and S.typ='P' and S.cislo=R.potomek AND S.vytvoreno<=now() GROUP BY S.pridal ORDER BY S.vytvoreno DESC LIMIT 0,15Omlouvám se jestli mi něco uniklo a nepobral jsem to…
R.cislo, které odpovídají více zápiskům.S.pridal.relace mají primární index jako autoincrement a je to pole cislo, tak jsem předpokládám, že nejvyšší cislo na daného uživatele je poslední záznam a nejnižší 1. záznam.cislo prvního a posledního záznamu relace.Neplati, dulezitejsi je S.vytvoreno. Blogy je totiz mozne schedulovat / odkladat, takze treba zapisek vytvoris v lednu, ale publikujes jej az v unoru. Zapisky z konce ledna budou tedy starsi, prestoze maji vyssi id.
R.cisla, S.pridalS.vytvoreno (... teda doufám):
SELECT Max(RR.cislo) as poslednicislo FROM
(SELECT S.pridal, MAX(S.vytvoreno) AS maxvytvoreno FROM relace AS R
INNER JOIN polozka AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek
INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=NOW()
GROUP BY S.pridal
ORDER BY Max(S.vytvoreno) DESC
) AS RPS
INNER JOIN spolecne as SS ON SS.pridal = RPS.pridal AND SS.vytvoreno = RPS.maxvytvoreno
INNER JOIN relace as RR ON RR.typ_potomka='P'AND RR.potomek=SS.cislo
GROUP BY SS.pridal LIMIT 0,15
POZOR: Pokud uživatel vložil více příspěvků v čase 1 sec. - smůla - budou tam všechny
SELECT column2
FROM (SELECT column2,id FROM t1 ORDER BY column1 DESC) AS tt1
INNER JOIN t2 ON tt1.id = t2.t1id_fk
WHERE t2.column42 > 7
Vrací výsledek tříděný dle column1, ale ve výsledku column1 neníSELECT * FROM (SELECT TOP 3 FROM t1 ORDER BY column DESC) as tt1 ORDER BY column ASCVrací 3 poslední (dle
column) záznamy z t1 setříděné dle column vzestupně
SELECT R.cislo FROM relace AS R
INNER JOIN polozka AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek
INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=now()
ORDER BY S.vytvoreno DESC LIMIT 0,15
Pokud předcházející platí, chyba je (u mě) v následujícím ... kde ? :)R.cislo je třeba omezit tak, aby tam byl jen 1× záznam pro S.Pridal a kolekce byla stále setříděná dle S.vytvorenoS.Pridal má být záznam s nejvyšším datem S.vytvoreno (ale S.vytvoreno je zároveň <=NOW()).
SELECT X.MaxCislo
FROM (SELECT Max(RR.cislo) as Maxcislo
FROM ( SELECT S.pridal, Max(S.vytvoreno) as lastpublished
FROM relace AS R
INNER JOIN polozka AS P ON R.typ_potomka='P' AND P.typ=12 AND P.cislo=R.potomek
INNER JOIN spolecne AS S ON S.cislo=R.potomek AND S.typ='P' AND S.vytvoreno<=now() GROUP BY S.pridal
) as F
INNER JOIN spolecne AS SS ON SS.typ='P' AND SS.vytvoreno<=now() AND SS.pridal = F.pridal AND SS.vytvoreno = F.lastpublished
INNER JOIN relace AS RR ON RR.typ_potomka = 'P' AND RR.potomek = SS.cislo
INNER JOIN polozka AS PP ON PP.typ=12 AND PP.cislo=RR.potomek
GROUP BY F.pridal
) AS X
INNER JOIN relace RRR ON X.Maxcislo = RRR.cislo
INNER JOIN spolecne as SSS ON RRR.potomek = SSS.cislo AND SSS.typ = 'P'
ORDER BY SSS.vytvoreno DESC LIMIT 0,15
Tímto končím :)pridal, vyšel bych z tabulky autorů (tu tam nemáš uvedenou, ale předpokládám, že existuje), kde je právě každý autor jen jednou.
A ke každému autorovi bych pomocí vnořeného selectu dotáh jeho nejnovější záznam vyhovující podmínkám.
Tedy vpodstatě tvůj select z původního dotazu ofiltrovaný navíc na pridal=autor, seřazený dle vytvoreno sestupne a limit 1
Tento výsledek bych seřadil dle vytvoreno sestupne s limitem 15.
Z hlavy nedám teď SQL dohromady, já to zas tak často nepoužívám a nemám syntaxi v hlavě.
Jen nástin:
SELECT a.autor, (SELECT cislo, vytvoreno WHERE ...... S.pridal=A.autor ORDER BY vytvoreno DESC LIMIT 1) ORDER BY vytvoreno DESC LIMIT 15
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.