2

我删除了我之前的问题,以便更容易理解。我正在使用这个数据库模式开发一个论坛:

ID:INT->PRIMARY-KEY->AUTO_INCREMENT
IDTOPIC:INT (0 if it is the "father" topic OR father's ID if it's a reply)
IDUSER:INT (ID of user who posted)
CONTENT:MEDIUMTEXT
DATE:TIMESTAMP

如果没有回复,我需要按日期排序查询,仅在哪里获得最后一个线程回复(如果“我是最后一个回复的用户”,IDUSER<>$userid)或父线程主题。即使主题或回复结果,我需要打印第一个线程 IDTOPIC/IDUSER

我的理想结果应该是这样的:

ID:IDTOPIC:IDUSER:CONTENT:DATE:IDLASTREPLY:IDLASTUSERREPLY:LASTCONTENTREPLY:LASTDATEREPLY

如果最后四个字段为 NULL,则没有问题。我需要尽可能快的查询。请帮我!

4

2 回答 2

1
SELECT fa.ID, fa.IDTOPIC, fa.IDUSER, fa.CONTENT, fa.DATE,
  re.ID as IDLASTREPLY,
  re.IDUSER as IDLASTUSERREPLY,
  re.CONTENT as LASTCONTENTREPLY,
  re.DATE as LASTDATEREPLY,
  CASE WHEN (re.DATE is NULL) THEN fa.DATE ELSE re.DATE END as LASTUPDATE
FROM post fa
  LEFT JOIN post re ON re.ID =
    (SELECT ID FROM post WHERE IDTOPIC = fa.ID ORDER BY DATE DESC LIMIT 1)
WHERE fa.IDTOPIC = 0
ORDER BY LASTUPDATE DESC

并随心所欲地订购。
但这并不是那么好的表现。我认为你可以改进你的表结构。

编辑:为 ORDER 添加 LASTUPDATE

于 2012-04-25T17:57:49.513 回答
0

不幸的是,在一些帖子之后,这个选择不太好......今天,表上总共有大约 900 条记录,当我按我的用户 ID 过滤线程时(只有 45 个不同的线程!),MySQL 需要 0.30 秒(一开始,只需要 0.04/0.05 秒......我认为恶化与我订阅的线程数成正比)这可能意味着当我订阅 300 个不同的线程时,我应该等待大约 2 秒来进行此查询。 .. 太多了。奇怪的是,如果我“限制 0,10”这个查询或获得完整查询,执行速度不会改变!这就是为什么我认为它不好......因为我想即使我限制它也必须选择整个数据。没有办法解决。这就是我设置查询的方式。有一个新的通知表,

通知表字段:id、idcontent、userid

SELECT 
    CASE WHEN (re.id is NULL) THEN fa.id ELSE re.id END AS id, 
    fa.id as idtopic, 
    CASE WHEN (re.userid is NULL) THEN fa.userid ELSE re.userid END AS userid, 
    CASE WHEN (re.content is NULL) THEN fa.content ELSE re.content END AS content, 
    n.notify, 
    u.id as reuserid, u.name, u.surname, u.photo, 
    CASE WHEN (re.date is NULL) THEN unix_timestamp(fa.date) ELSE unix_timestamp(re.date) END AS LASTUPDATE 
FROM notifications AS n 
LEFT JOIN post AS fa 
    ON fa.id = n.idcontent 
LEFT JOIN post AS re 
    ON re.id=(SELECT ID FROM post WHERE IDTOPIC = fa.ID AND userid <> $USERID ORDER BY DATE DESC LIMIT 1) 
LEFT JOIN users AS u 
    ON u.id = ( CASE WHEN (re.userid is NULL) THEN fa.userid ELSE re.userid END ) 
WHERE 
    n.userid = $USERID 
    AND NOT (fa.userid = $USERID AND re.userid = $USERID)
于 2012-05-09T23:15:55.137 回答