ugrás a tartalomhoz

Fórumok listázása kommentek alapján

Tanul0 · 2010. Jún. 11. (P), 16.08
Üdv!

adott 2 Mysql tábla



Ebből a két táblából szeretnék egy olyan lekérdezést csinálni, ami az utolsó komment alapján listázza ki az utolsó 5 topikot, de 1 topik maximum csak 1x szerepelhet (like weblabor forum)!

Jelenleg a lekérdezésem:
  1. $sql=sql_safe_query("SELECT topic.id, topic.name, comment.topic, comment.uid, comment.date FROM topic, comment WHERE topic.id=comment.topic ORDER by comment.date DESC LIMIT 5");  
Ez sajnos többször is kiír egy topikot.
Mi lehet a megoldás?

( Jelenleg nem használok összefűző táblát, későbbiekben tervezem: topic_comment {id, topicid, commentid} tehát nem optimalizálásban kérek segítséget)

Előre is köszönöm!
Üdv!
 
1

hát továbbra sem találtam

Tanul0 · 2010. Jún. 12. (Szo), 06.05
hát továbbra sem találtam megoldást erre, senkinek nincs ötlete?
2

"Segíts, hogy

kuka · 2010. Jún. 12. (Szo), 09.25
"Segíts, hogy segíthessünk."

Másolj be ide szépen egy-egy create és insert utasítást amellyel létrehozhassuk a két táblát pár adattal. Aztán írd le, hogy a példa adatokból mit kellene összeszedjen a select utasítás.

Ha kész adatot kapok, egy annyicska időt össze tudok szedni, hogy a lekérdezést megírjam. De részemről többre nem telik.
3

nem kell

plip · 2010. Jún. 12. (Szo), 11.17
Mivel a kapcsolat "több az egyhez", ezért nincs szükség kapcsolótáblára, a táblaszerkezet így tökéletes, ahogy van. Mindjárt megpróbálom összerakni a queryt is, ami biztos, hogy kell bele group by.
4

ezt most így fejből:

plip · 2010. Jún. 12. (Szo), 12.15

SELECT topic.id, topic.name, (SELECT MAX(comment.date) FROM comment WHERE comment.topic=topic.id ) date

  FROM topic 
  WHERE topic.id IN (
      SELECT comment.topic
        FROM comment
        GROUP BY comment.topic
        ORDER BY comment.id DESC
        LIMIT 0,5
      )
  ORDER BY date DESC;

De ha valaki tud elegánsabb megoldást, engem is érdekelne... ;)
5

Én ezt találtam ki: SELECT

Crystal · 2010. Jún. 12. (Szo), 15.07
Én ezt találtam ki:
  1. SELECT topic.id topic_id  
  2.     , topic.name  
  3.     , comment.id comment_id  
  4.     , comment.uid  
  5.     , comment.date  
  6. from topic   
  7.     join (select topic topic_id  
  8.         , id comment_id       
  9.     from comment where `datein (select max(`date`) from comment group by topic)) last_comments   
  10.     on topic.id = last_comments.topic_id  
  11.     join comment on last_comments.comment_id = comment.id  
  12. order by comment.`datedesc  
  13. limit 5  
mondjuk ha két komment ugyanabban az időpontban keletkezik akkor lehet megkergül egy kicsit, szóval nem tökéletes (ez a date alapján in-es joinolás nem egy szépség egyébként sem)
6

Szeretném megköszönni a

Tanul0 · 2010. Jún. 13. (V), 05.16
Szeretném megköszönni a hozzászólásokat! Crystal megoldása az ami a legmeggyőzőbb, és működőképes. Dátum alapján tényleg nem célszerű, id alapján érdemes, mivel 2 azonos id nem fordulhat elő. Ezzel ki is lett kerülve az egyszerre érkező kommentek miatt keletkező bug.

Tehát a megoldás:
  1. SELECT topic.id topic_id    
  2.        , topic.name    
  3.        , comment.id comment_id    
  4.        , comment.uid    
  5.        , comment.date    
  6.    from topic     
  7.        join (select topic topic_id    
  8.            , id comment_id         
  9.        from comment where `id` in (select max(`id`) from comment group by topic)) last_comments     
  10.        on topic.id = last_comments.topic_id    
  11.        join comment on last_comments.comment_id = comment.id    
  12.    order by comment.`id` desc    
  13.    limit 5    
Mégegyszer nagyon szépen köszönöm!
7

szivesen:)

Crystal · 2010. Jún. 13. (V), 20.26
nem is jutott eszembe hogy a legutóbbi kommentnek lesz a legnagyob az ID-je
8

juj!

Ifju · 2010. Jún. 13. (V), 20.31
Hali!

Én inkább az alábbi megoldást ajánlanám, mert a fenti megoldások nagyon csúnya terhelést tudnak okozni egy nagyobb adatbázisban, bár gondolom, nem több tízmillió bejegyzésre is készülsz.
  1. SELECT   
  2. topic.id AS topic_id,   
  3. topic.name AS topic_name,  
  4. MAX(comment.dateAS last_comment_date,  
  5. MAX(comment.id) AS last_comment_id  
  6. FROM  
  7. topic  
  8. LEFT JOIN comment  
  9. ON comment.topic = topic.id  
  10. GROUP BY  
  11. topic.id  
  12. ORDER BY last_comment_id DESC  
  13. LIMIT 5  
Létezik ennél elegánsabb megoldás, de ahhoz változtatnod kell az adatszerkezeteden: tárold a topicok rekordjában, hogy ki és mikor szólt hozzá utoljára, és akkor csak egy táblából kell lekérdezned, ami megfelelő indexekkel egymillió topic esetén is villámgyors lesz.
9

az is igaz, lehet dobok bele

Tanul0 · 2010. Jún. 14. (H), 16.17
az is igaz, lehet dobok bele még egy mezőt, és akkor tényleg nem lesz ilyen gond, majd még megfontolom.