Autor | Zpráva | ||
---|---|---|---|
Dandys2012 Profil * |
#1 · Zasláno: 31. 8. 2017, 16:27:39
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 |
#2 · Zasláno: 31. 8. 2017, 17:40:21
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 |
#3 · Zasláno: 31. 8. 2017, 19:02:31
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ě |
||
Časová prodleva: 11 dní
|
|||
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 |
#5 · Zasláno: 11. 9. 2017, 16:01:42
Ř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 |
#6 · Zasláno: 11. 9. 2017, 16:03:53
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 |
#8 · Zasláno: 11. 9. 2017, 16:18:27
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 |
#10 · Zasláno: 11. 9. 2017, 16:31:05
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 |
#12 · Zasláno: 13. 9. 2017, 18:07:14
Dandys2012:
Máš správne použité indexy? Čo hovorí EXPLAIN? na 33k príspevkov je to stále dosť dlho. |
||
Časová prodleva: 7 let
|
0