получить все связанные теги? - PullRequest
0 голосов
/ 04 декабря 2009

это очень сложно. у меня есть таблица с 2 столбцами thread_tag_map: thread_id и tag_name.

  thread_id tag_name
  1         football
  1         manchester
  2         manchester
  2         england
  3         england
  3         queen
  4         queen
  4         diana

Как видите, один поток может иметь несколько тегов, и это дает нам эффект связывания тегов.

если вы введете тег футбол, я хочу, чтобы он отображал все связанные теги с футболом. то есть Манчестер, Англия, Королева и Диана.

так вот что я кодировал до сих пор:

    // get all thread_id:s for tag_name
    $query = "SELECT *
            FROM thread_tag_map
            WHERE tag_name = 'football'";

    $result1 = mysqli_query($conn, $query) or die ("Couldn't execute query: " . mysqli_error($conn));

    // get all tag_name:s for each thread_id
    while($row = mysqli_fetch_assoc($result1))
    {
        $thread_id = $row['thread_id'];

        $query = "SELECT *
                FROM thread_tag_map
                WHERE thread_id = $thread_id";

        $result2 = mysqli_query($conn, $query) or die ("Couldn't execute query: " . mysqli_error($conn));

    // add each tag to array
    while($row = mysqli_fetch_assoc($result2))
    {
        $tag_array[] = $row['tag_name'];
      }
   }

но это только даст мне футбол и манчестер. Я не знаю, как я могу сделать хороший код для цикла (для цикла?). может быть, есть 100 связанных тегов.

Я думаю, вы понимаете идею. кто-то делал это раньше?

Ответы [ 2 ]

1 голос
/ 04 декабря 2009

Вы можете формализовать то, что вы пытаетесь сделать здесь, с помощью теории графов. Вы хотите, чтобы все подключенные узлы были заданы по заданному списку смежности (своего рода). Чтобы сделать это, вы хотите выполнить поиск в ширину графика. Это важно, чтобы избежать циклов.

Представление, которое вы выбрали, хотя и не совсем эффективно, но, безусловно, может сработать.

В псевдокоде ваш алгоритм должен выглядеть примерно так:

interesting-tags = input-tag
output = empty
for tag in interesting-tags:  (Must be in order)
    select related-tags to tag
    for newtag in related-tags:
        if newtag is not in output:
             append newtag to interesting-tags and output

return output

Итак, интересные теги должны представлять собой некую форму очереди, поскольку вам нужно добавить новые элементы сзади и взять их спереди.

Выходные данные должны быть типа данных Set, так как вам нужно проверить, есть ли вещи в наборе, и добавить их.

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

0 голосов
/ 04 декабря 2009

Если вы создаете какой-то форум / доску обсуждений и если под связанными тегами вы подразумеваете все теги, которые были опубликованы в темах, связанных с доской / форумом, не будет ли проще просто выбрать их все ? Поскольку вы создаете теги на основе потока, все они должны быть правильно размещены, поэтому вам просто нужно получить их все.

Кроме того, я бы предложил вам создать временную таблицу как раз для этой цели, где вы будете хранить «связанные теги», как только они понадобятся в первую очередь, сохраняя массив в этой таблице для будущего поиска и обновляя его. когда какое-то новое слово дается в качестве тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...