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:

$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:

SELECT topic.id topic_id
	, topic.name
	, comment.id comment_id
	, comment.uid
	, comment.date
from topic 
	join (select topic topic_id
		, id comment_id 	
	from comment where `date` in (select max(`date`) from comment group by topic)) last_comments 
	on topic.id = last_comments.topic_id
	join comment on last_comments.comment_id = comment.id
order by comment.`date` desc
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:

SELECT topic.id topic_id  
       , topic.name  
       , comment.id comment_id  
       , comment.uid  
       , comment.date  
   from topic   
       join (select topic topic_id  
           , id comment_id       
       from comment where `id` in (select max(`id`) from comment group by topic)) last_comments   
       on topic.id = last_comments.topic_id  
       join comment on last_comments.comment_id = comment.id  
   order by comment.`id` desc  
   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.
SELECT 
topic.id AS topic_id, 
topic.name AS topic_name,
MAX(comment.date) AS last_comment_date,
MAX(comment.id) AS last_comment_id
FROM
topic
LEFT JOIN comment
ON comment.topic = topic.id
GROUP BY
topic.id
ORDER BY last_comment_id DESC
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.