PHP加入两个表的帮助

时间:2008-12-18 23:26:47

标签: php mysql select join

我正在学习php,因为我一直在这里,我完全迷失了。我以前从未真正使用过加入,我想我需要在这里,但我不知道。我不希望任何人为我做这件事,但如果你能指出我正确的方向,这将是惊人的,我已经尝试阅读加入,但有20种不同的方法,我只是迷失了。 / p>

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

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

我正在重做的部分是我如何获取索引页面的最后一篇文章的信息。我设置它的方式是为了避免使用连接,我将它存储在board_forums表中的最新帖子的信息,所以说有一个名为“关闭主题”的部分我会有一个“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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

其他实例不太可能需要更新任何统计信息(删除线程会触发论坛更新,在主题计数中显示少一个主题)。

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

答案 2 :(得分: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不能那样工作。你不能订购或限制连接(或做许多其他有用的事情),所以你必须获取每一行,然后用代码扫描它们(这很糟糕)。

总之,不用担心。对于您希望在一次点击中加载所有论坛和所有帖子的实际案例,请使用联接。

答案 3 :(得分:0)

简单的解决方案将导致大量查询,一些是可选的,因为您已经发现了。

对此的经典方法是缓存结果,并且只在一段时间内检索一次。缓存不必长寿;在繁忙的网站上即使两三秒也会产生显着的差异。

将数据去标准化为您已经阅读的表格无论如何都会有所帮助。这种方法可以节省您计算可选查询的时间,并且可以获得一些便宜的胜利,因为当插入已经发生时,它只是一次更新。但它将一些数据完整性转移到应用程序。

顺便说一下,您可能会遇到线程的递归查询问题。如果使用“简单”算法,关系数据库不会很好地存储层次数据。更好的方法是有时被称为“树木”。不幸的是,谷歌有点困难,所以here are some links