Autor Zpráva
Dandys2012
Profil *
Zdravím.
Nikdy jsem nedělal složené dotazy a zabralo by mi spousty času to studovat. Rád bych poprosil oradu někoho, kdo ví, jak se to dělá.

Jde mi o to, že mám tabulku FORUM (s datumem založení) a tabulku FORUM_PRISPEVKY (s datumem založení a ID ke kerému foum patří) a chtěl bych pod sebou vypsat forum podle data buď příspěvku nebo založení nového, který ještě příspěvek nemá..tedy potřebuju čerpat z obou tabulek.
Tomášeek
Profil
Dandys2012:
a zabralo by mi spousty času to studovat.
...Což není ten správný přístup.

Něco si nastuduj, o něco se pokus. Pokud ten pokus nebude fungovat, přijď pro radu, kde děláš chybu. Přístup "nic neumím, nechci se to naučit, udělejte to za mě" je od tebe hloupý.
juriad
Profil
Vyber splynuté maximum datumu z forum_prispevky s datumem z forum, a vše z forum
z forum se zleva připojeným forum_prispevky tak, že id ve forum se rovná id fora v forum_prispevky
seskup podle id ve forum
seřaď podle prvního výsledného sloupce sestupně
Dandys2012
Profil *
Stejně jsem z toho blbej.

Jak docílit toho, aby to řadilo časy z obou tabulek?
Kdyz jsem zkusil neco jako forum.cas AS cas ... forum_prispevky.cas AS cas, tak mi to napsalo, že každej musí mít svuj vlastní alias.


SELECT MAX(time) AS cas FROM forum_post
LEFT JOIN forum ON forum_post.forum_id = forum.id
GROUP BY forum.id ORDER BY cas DESC

tohle je moje snaha, která nefunguje.
Kajman
Profil
Řadit máte ze splynutí těchto dvou sloupců.
select coalesce(max(forum_prispevky.cas),forum.cas) cas,
...
order by 1 desc

Ukažte dotaz, třeba tam bude potřeba jen malá změna.
Kajman
Profil
A pokud máte takto tabulky obráceně, použijte right join.
Dandys2012
Profil *
Tohle taky nefunguje
SELECT MAX(time) AS cas FROM forum_post fp
LEFT JOIN ( SELECT time AS cas, id FROM forum ff)
GROUP BY ff.id ORDER BY cas DESC


Jediný, co se mi povedlo bylo vypsání samotných příspěvků

SELECT MAX(time) AS cas FROM forum_post GROUP BY id ORDER BY cas DESC

ale nedokážu to spojit s forum.


Vzdávam to. Jdu jezdit kamionem.
Kajman
Profil
SELECT Coalesce(Max(fp.time), ff.time) AS cas,
       ff.id
FROM   forum_post
       RIGHT JOIN forum ff
               ON fp.forum_id = ff.id
GROUP  BY ff.id
ORDER  BY cas DESC
Dandys2012
Profil *
Muj největší pokrok je tohle:

SELECT MAX(time) AS cas FROM forum_post fp
LEFT JOIN ( SELECT id, time AS cas FROM forum) ff
ON ff.id = fp.forum_id
GROUP BY ff.id ORDER BY cas DESC

To funguje.. jenže nevim jak k tomu přiřadit výpis title, protože to zřejmně bere jako první hlavní tabulku tu příspěvkovou a já potřebuju title z tý ff


Poraďte tedy prosím, jak z posledního DQL dotazu vytáhnout ff.title .


Kajman:
U tvého dotazu mi to píše: Unknown column 'fp.time' in 'field list'


HURÁÁ trochu jsem to upravil a výsledek:

SELECT ff.title, COALESCE( MAX( fp.time ) , ff.time ) AS cas, ff.id
FROM forum_post fp
RIGHT JOIN forum ff ON fp.forum_id = ff.id
GROUP BY ff.id
ORDER BY cas DESC 
LIMIT 0 , 100


Díky moc, Kajmane.
Kajman
Profil
Možná by mohlo být o chlup rychlejší toto (v kombinaci s indexem nad kombinací sloupců (forum_id,time) and tabulkou s příspěvky)

SELECT Coalesce(x.maxtime, f.time) cas,
       f.id,
       f.title
FROM   (SELECT Max(fp.time) AS maxtime,
               fp.forum_id
        FROM   forum_post fp
        GROUP  BY fp.forum_id) x
       RIGHT JOIN forum f
               ON x.forum_id = f.id
ORDER  BY cas DESC 
Dandys2012
Profil *
Tak jsem zkusil modernizovat jedno z mých starších forum, kde je 33 tisíc příspěvků a ten první dotaz trvá 36 sekund.


A ten druhej dotaz necelou sekundu.. takže je opravdu o chlup rychlejší :D
pcmanik
Profil
Dandys2012:
Máš správne použité indexy? Čo hovorí EXPLAIN? na 33k príspevkov je to stále dosť dlho.

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: