Autor Zpráva
Tori
Profil
Pěkný den. Upravuju jedno fórum (nějaké vlastní řešení), konkrétně seznam příspěvků od jednoho uživatele. Chtěla bych z každého příspěvku zobrazit jen kus textu + odkaz přímo na ten příspěvek v kontextu tématu (s kotvou, něco jako index.php?threadID=123&stranka=2#3). Potřebuju teda zjistit, kolikátý příspěvek v tom tématu to je. DB schéma je zjednodušeně takovéhle:
-- tabulka forum
forumID (int)
permission (tinyint) -- min.přístup.práva
...

-- tabulka posts
postID (int)
parentID (int) -- pokud je 0, tak je to první příspěvek, resp. téma. Jinak odkazuje na postID prvního příspěvku tématu.
postForum (int) -- ID fóra. Je vyplněné u všech příspěvků.
autorID (int)
postTime (int) -- čas napsání příspěvku jako unix timestamp
....
Zkoušela jsem to různými poddotazy typu SELECT COUNT(*) WHERE postTime < $time, ale nepovedlo se mi udělat, aby se offset počítal pro každé téma zvlášť a bylo to pomalé. Jinak v tom seznamu se zobrazují po asi třiceti na stránku, tak přinejhorším by to šlo udělat i (1+30) dotazy. Poradili byste lepší řešení? Díky moc.
Kajman_
Profil *
Udělal bych to tím korelovaným poddotazem pro těch zobrazených 30 řádků.

select p.*,
       (select count(*)
        from   posts p2
        where  p2.parentId = nullif(p.parentId,0)
               and (p2.postTime < p.postTime or
               (p2.postTime = p.postTime and p2.postID < p.postID))) nadnim
from   posts p
where  p.autorId = 42
order  by p.postID desc
limit  30

Pro rychlost pomůže vícesloupcový index (postForum, postTime).

Stránku a kotvu pak můžeš vypočítat dělením a zbytkem po dělení (s přihlédnutím zda je parentID 0).
Tori
Profil
Kajman:
Až teď jsem to vyzkoušela, děkuju moc!
Kcko
Profil
Tori:
Nebude lepší toto:

odkaz povede pouze na ID příspěvku viz http://www.vw-club.cz/viewtopic.php?t=119609&p=2281581#p2281581
A počet stránek dopočítáš až v rozkliknutém topicu. Tím myslím jako do stránkování na které stránce se příspěvek nachází.
Výhodu to má v tom, že to bude mnohem rychlejší, protože v tomto případě počítáš příspěvky v 1 topicu, jedním relativně snadným dotazem a nikoliv korelovaným jak napsal Kajman, což funguje, ale určitě to bude mnohem pomalejší.
Tori
Profil
Kcko:
Aha ano, to je určitě jednodušší postup než co jsem chtěla původně, děkuju.
Kajman_
Profil *
Kcko:
Ale tak zase vznikne spousta duplicitních odkazů.

Tori:
Klidně si zkus oba způsoby. Tipl bych, že s tím indexem tam bude v rychlosti pramalý rozdíl.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0