Autor Zpráva
hexcross
Profil
Zdravím!

Snažím se už několik dní ale nevím si rady... mám 2 tabulky :

[forum_topics]
------
id | title

[forum_posts]
------
id | topic | text


Nyní chci vypsat 5 posledních příspěvků z [forum_posts] - ALE nechci aby se duplicitně vypisovali z jednoho tématu! Tzn. že každý vypsaný příspěvěk musí pocházet z unikátního tématu.

SQL dotaz skládám v dibi :

Zkoušel jsem distinct:
        
$sqlForumLatest = dibi::select('p.topic,p.user_id,p.date,p.text,t.title')->setFlag('distinct')
        ->from('[forum_posts]')->as('p')
        ->leftJoin('[forum_topics]')->as('t')->on('p.topic = t.id')
        ->orderBy('p.id DESC')->limit('5');

SQL:
SELECT p.user_id,p.date, p.topic,p.text, t.title 
FROM `forum_posts` AS `p` 
LEFT JOIN `forum_topics` AS `t` ON p.topic = t.id 
GROUP BY `p`.`topic` 
ORDER BY p.id DESC 
LIMIT 5

Zřejmě to nebere v potaz.

Zkoušel jsem groupBy :
$sqlForumLatest = dibi::select('p.user_id,p.date, p.topic,p.text, t.title')
        ->from('[forum_posts]')->as('p')->groupBy("p.topic")
        ->leftJoin('[forum_topics]')->as('t')->on('p.topic = t.id')
        ->limit('5')->orderBy('p.id DESC');

SQL:
SELECT DISTINCT p.topic,p.user_id,p.date,p.text,t.title 
FROM `forum_posts` AS `p` 
LEFT JOIN `forum_topics` AS `t` ON p.topic = t.id 
ORDER BY p.id DESC 
LIMIT 5

To zase nevypíše duplicitní téma ale zase nevypíše poslední příspěvek z tématu ale první! (ignoruje orderBy?)

Nápady? Díky.
Tori
Profil
A něco takovéhoto?
SELECT p.*, ref.title
FROM forum_posts p
INNER JOIN (
    SELECT MAX(p2.id) maxId, t.title
    FROM forum_topics t
    INNER JOIN forum_posts p2 ON p2.topic = t.id
    GROUP BY t.id
    ORDER BY maxId DESC
    LIMIT 5
) ref ON ref.maxId = p.id
Kajman
Profil
A kdyby to bylo pomalé, mohla by pomoci drobná změna, kdy se groupuje až po omezení pěti topiců.

SELECT p.*,
       t.title
FROM   forum_posts p
       INNER JOIN (SELECT Max(p2.id) maxId,
                          pt.topic
                   FROM   (SELECT DISTINCT p3.topic
                           FROM   forum_posts p3
                           ORDER  BY p3.id DESC
                           LIMIT  5) pt
                          INNER JOIN forum_posts p2
                                  ON p2.topic = pt.topic
                   GROUP  BY pt.topic) ref
               ON ref.maxid = p.id
       INNER JOIN forum_topics t
               ON t.id = ref.topic
ORDER  BY p.id DESC
hexcross
Profil
Děkuji oběma! Použil jsem řešení od Tori, vlastně jen protože je kratší :-) ale fungují správně obě...

Nenapadlo by mě že to bude tak složité, heh.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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