编写更好的代码/查询

时间:2012-09-25 11:51:42

标签: php mysql performance loops while-loop

在我的网站中,用户可以更新,其他人可以像往常一样评论更新,就像其他社交网站一样。

正在做什么:

query = fetches first name, last name, user id, update id, update post UNION same details for the user who has logged in i.e /* Updates Of Current Logged In User + Updates Of People He Is Following */

loop {
prints first name last name and update
}

后来我引入了评论功能,所以现在我所做的是在循环中我调用一个查询并再次运行循环以进行评论..

loop {
prints first name last name and update

commentquery = fetches firstname, last name, user id, comment, of the particulat post
    again loop {
         prints first/last name of the person who commented, and his comment
     }
}

现在根据我的想法,我想这可以通过SQL查询完成,当我检索帖子时,我可以随身携带它的评论,或者这是正确的方法吗?问题是当外循环运行时,内循环也会运行以获取相应的注释,那么我可以连接表来检索与发布/更新相关的注释吗?

2 个答案:

答案 0 :(得分:1)

如果没有您的数据库结构或实际的SQL,这很难回答,但我试图尽可能地进行概括。您要做的事情应该通过带有两个查询和一个循环的SQL完成,如下所示。

编辑您的精细循环并重新执行查询。您可以使用SQL一次性获取所有这些数据,但您将在每次调用中复制所有信息。为了扩展性和可读性,我会坚持使用两个查询和两个循环

/** updated after op's comments **/

SELECT data, that, you, want, for, one, post
FROM posts AS a
INNER JOIN users AS b ON b.id = a.user_id

loop over query results () {

    /** output the post data **/

    /** Then select the users who have posted on this post **/
    SELECT a.comments, b.username
    FROM comments AS a
    INNER JOIN users AS b ON b.id = a.id
    INNER JOIN posts AS c ON c.id = a.post_id AND c.post_id = '[post id value]'
    ORDER BY a.date_posted;

    loop comments here {
      /** output comments here **/
    }
}

答案 1 :(得分:0)

我认为仅在查询中合并它可能是可能的但不是很好。

但是,如果我正确理解你不喜欢的是注释的查询是在循环中使用不同的WHERE子句执行的。您可以通过在查询数据库以获取更新之前获取您在一个查询中显示的所有更新的所有注释来消除此错误:

query = select all comments for all updates joined with usernames and whatnot
loop{
    $comments[postid][] = data
}

在此之后,您可以对更新进行常规查询,并从预加载的数组而不是数据库中访问注释。不确定这是否是更好的解决方案。从好的方面来说,您只有一个查询更新,一个用于评论,而不是一个用于更新,一个用于每个更新的注释。(如果有10次更新,则需要2个查询而不是11个)。不确定差异是否真的很大。

缺点是,您之前使用的代码更加明显,并且更容易为其他人阅读。