1

我只是在学习php,我完全迷失在这里。我以前从未真正使用过join,我想我需要在这里,但我不知道。我不指望任何人为我做这件事,但如果你能指出我正确的方向,那就太棒了,我已经尝试阅读有关连接的内容,但有 20 种不同的方法,我只是迷路了。

基本上,我手动编写了一个论坛,它工作正常但效率不高。

我有 board_posts(用于帖子)和 board_forums(用于论坛、类别和部分)。

我正在重做的部分是如何获取索引页最后一篇文章的信息。我设置它的方式是为了避免使用连接,我让它将最新帖子的信息存储在 board_forums 的表中,所以说有一个名为“Off Topic”的部分,我会有一个“forum_lastpost_username/userid”字段/posttitle/posttime”,当用户发布等时我会更新它。但这很糟糕,我试图动态地抓取它并摆脱这些字段。

现在我的查询就像:

`SELECT * FROM board_forums WHERE forum_parent='$forum_id''

然后我有一些东西,我可以在其中获取该论坛的信息(名称、描述等),最后一篇文章的所有数据都在那里:

    $last_thread_title = $forumrow["forum_lastpost_title"];
    $last_thread_time = $forumrow["forum_lastpost_time"];
    $lastpost_username = $forumrow["forum_lastpost_username"];
    $lastpost_threadid = $forumrow["forum_lastpost_threadid"];

但我需要摆脱它,并从 board_posts 获取它。在board_posts 中设置的方式是,如果是线程,post_parentpost 为NULL,如果是回复,则该字段具有线程的id(主题的第一篇文章)。所以,我需要获取最新的 post_date,看看是哪个用户发布的,然后看看 parentpost 是否为 NULL(如果它是 null,那么最后一个帖子是一个新线程,所以我可以在那里获取标题和用户的所有信息,但是如果不是,那么我需要获取该线程中第一个帖子的信息(标题,id)(可以通过查看 post_parentpost 是什么,查找该 ID 并从中获取标题来找到它。

这有任何意义吗?如果是这样,请帮助我:(

任何帮助是极大的赞赏!!!!

4

4 回答 4

3

每当插入帖子或回复时更新 board___forums - 关于性能 - 并不是最糟糕的主意。要显示索引页面,您只需从一个表 board_forums 中选择数据 - 这绝对比选择第二个表来获取“最后帖子的信息”要快得多,即使使用巧妙的连接也是如此。

于 2008-12-18T23:55:13.173 回答
1

看起来你已经做对了。

如果你要加入,你会这样做:

SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id
WHERE forum_parent = '$forum_id'

这样做的问题是,它会让你每篇文章都发帖,这没有用(而且非常慢)。你想要做的是这样的

SELECT * FROM board_forums
JOIN board_posts ON board_posts.forum_id = board_forums.id ORDER BY board_posts.id desc LIMIT 1
WHERE forum_parent = '$forum_id'

除了 SQL 不能那样工作。您不能订购或限制连接(或做许多其他有用的事情),因此您必须获取每一行,然后在代码中扫描它们(这很糟糕)。

简而言之,别担心。对于您确实希望一次加载所有论坛和所有帖子的实际情况,请使用连接。

于 2009-02-19T02:27:57.837 回答
1

你最好只更新每个动作的统计信息,新帖子,删除帖子等。

其他实例可能不需要任何统计数据更新(删除线程将触发论坛更新,以在主题计数中显示更少的主题)。

想想用户会执行的所有操作,在大多数情况下,您不需要更新任何统计信息,因此,即时获取计数非常低效,您这样认为是正确的。

于 2008-12-19T12:40:08.663 回答
0

正如您已经发现的那样,简单的解决方案将导致大量查询,其中一些是可选的。

经典的方法是缓存结果,并且只偶尔检索一次。缓存不必长期存在;即使在繁忙的网站上两三秒也会产生重大影响。

将数据反规范化到您已经在阅读的表格中会有所帮助。这种方法可以节省您计算可选查询的时间,并且可能是一个便宜的胜利,因为它只是在插入已经发生时再进行一次更新。但它会将一些数据完整性转移到应用程序中。

顺便说一句,您的线程可能会遇到递归查询问题。如果您使用“简单”算法,关系数据库就不能很好地存储分层数据。更好的方法是有时称为“设置树”。不幸的是,谷歌有点难,所以这里 一些 链接

于 2009-02-19T02:08:27.897 回答