我通过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并且代码有点疯狂,但我在朋友兄弟网站上工作,所以没有太多权限去改变它。
答案 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运算符