Нужна логика с PHP, чтобы пройтись по некоторым результатам MySQL DB

У меня есть следующие результаты, возвращаемые через запрос 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

Мне нужно перебрать результаты и создать строку, которая будет включать tag_slugs, связанные с каждым набором идентификаторов статей. Столбцы name и tag_id не обязательны для этой части кода.

Например …

69487 будет иметь строку:<исследование>’

69488 будет иметь строку, которая:<События><военные>’

69489 будет иметь строку:<искусства><церкви>’

69490 будет иметь строку, которая:<лесоводство><промышленность><искусственный><политика>’

…и столбец с именем теги будет обновлен в БД с этими строками и соответствующим 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, а коды немного сумасшедшие, но я работаю над сайтом друзей-братьев, так что не так уж много полномочий для его изменения.

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

Другие решения

Возможно, более чистый способ сделать это с помощью PHP — создать ассоциативный массив, в котором ваши article_ids будут использоваться в качестве ключей, а строка, содержащая связанные теги в качестве значений.
Например.

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

Затем в конце вы просто повторяете с foreach зациклите его и вставьте данные в вашу базу данных.

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, вы можете использовать оператор DISTINCT внутри функции GROUP_CONCAT

0
По вопросам рекламы [email protected]