需要一些PHP逻辑来循环一些mysql数据库结果

时间:2014-11-02 10:20:38

标签: php mysql optimization logic

我通过mysql查询返回以下结果:

tag_id   article_id (asc)     name         tag_slug
    56        69487           Exploration  exploration
    10        69488           Events       events
    32        69488           Military     military
    28        69489           Arts         arts
     3        69489           Religion     churches
    36        69490           Forestry     forestry
     8        69490           Industry     industry
    40        69490           Man-Made     man-made
    42        69490           Politics     politics

我需要遍历结果并创建一个字符串,其中包含与每组文章ID相关联的tag_slugs。这部分代码不需要name和tag_id列。

例如......

69487会有一个字符串:'< exploration>'

69488会有一个字符串:'< events>< military>'

69489将有一个字符串:'< arts>< churches>'

69490将有一个字符串:'< forestry>< industry>< man-made>< politics>'

...并且db中的列将使用这些字符串和相应的article_id进行更新。

我的尝试在下面工作,有点,但总是没有最后一次数据库更新。我确信必须有更好的逻辑方式,但现在我不能。

$previous_article_id = 0;

while( $row = $result->fetch_assoc() )
{
    if ( $row['article_id '] != $previous_article_id  && $previous_article_id  != 0 )
    {
        $sql = "
             UPDATE
                    ".ARTICLE_TABLE."
             SET
                    tags = '".$tags."'
             WHERE
                    id = ".$previous_article_id."
         ";

         $db->query($sql) OR sql_error($db->error.$sql);

         $tags = '';
    }

    if ( $row['article_id '] == $previous_article_id  || $previous_article_id  == 0 )
    {
        $tags .= '<'.$row['tag_slug'].'>';
    }

    $previous_article_id  = $row['article_id '];
}

是的,我知道它应该是PDO并且代码有点疯狂,但我在朋友兄弟网站上工作,所以没有太多权限去改变它。

3 个答案:

答案 0 :(得分:1)

首先,我对你如何解释你的问题以及你所尝试的内容表示赞赏。您的代码格式也很好。我经常在这里看到一些废话。所以我的赞美。

我应该将整个内容更改为以下内容:

$article_tags = array();
while( $row = $result->fetch_assoc() )
{
    $article_tags[$row['article_id']][] = $row['tag_slug'];
}

foreach( $article_tags as $article_id => $tag_array )
{
    $tags = '';
    foreach( $tag_array as $tag )
    {
        $tags .= '<' . $tag . '>';
    }

    $sql = "
             UPDATE
                    ".ARTICLE_TABLE."
             SET
                    tags = '".$tags."'
             WHERE
                    id = ".$article_id."
         ";

    $db->query($sql) OR sql_error($db->error.$sql);
}

答案 1 :(得分:0)

使用PHP更简洁的方法是创建一个关联数组,将article_ids作为键,将包含相关标记的字符串作为值。 例如

 $myArray[$row['article_id ']].='<'.$row['tag_slug'].'>';

然后,最后你只需用foreach循环遍历它并在数据库中插入数据。

答案 2 :(得分:0)

在我看来,您可以更轻松地使用GROUP_CONCAT函数从数据库中获取此结果

  SELECT  article_id, CONCAT('<',GROUP_CONCAT(tag_slug separator '><'),'>')
  from table GROUP BY article_id
  ORDER BY article_id DESC

如果你的tag_slug上有重复项,你可以在GROUP_CONCAT函数中使用DISTINCT运算符