Tüm ilgili etiketler olsun?

2 Cevap php

Bu çok zordur. Thread_id ve TAG_NAME: ben thread_tag_map 2 sütun içeren bir tablo var.

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

Gördüğünüz gibi bir konu birden çok etiketi olabilir ve bu bize etiketleri bir bağlantı etkisi verirler.

Eğer etiket futbol yazarsanız i futbol ilgili tüm etiketleri göstermek istiyorum. O Manchester, İngiltere, kraliçe ve Diana söylemektir.

bu nedenle burada ive şimdiye kadar kodlanmış budur:

    // 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'];
      }
   }

ama bu sadece bana futbol ve manchester verir. i Yüklü i döngü iyi bir kod yapmak için devam edebilirsiniz biliyorum (döngüsü için?) o aracılığıyla. belki 100 ile ilgili etiketler var.

i fikrini anlamak düşünüyorum. Birisi önce yapmış?

2 Cevap

You can formalize what you're trying to do a bit here with graph theory. You want all the connected nodes to a given one, given an adjacency list (sort-of). To do this, you would want to do a breadth first search of the graph. This is important to avoid cycles.

Seçtiğiniz temsili olsa da, tamamen verimli değildir, ama kesinlikle işe yarayabilir.

Pseudo-code olarak, algoritma bu gibi görünmelidir:

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

Eğer geri yeni öğeler eklemek ve ön onları almak gerekir beri Yani burada, ilginç etiketleri, bir Kuyruk çeşit olmalıdır.

Bir şeyler sette zaten olup olmadığını kontrol, ve bunları eklemeniz gerekir yana çıktı, bir Set veri türü olmalıdır.

Ben, ancak, PHP aşina değilim ve bu yüzden sizin için uygun olduğunu bilmiyorum. En azından, sen sadece bir dizi ile ihtiyaç işlemleri uygulayabilirsiniz tamamen verimli olmayabilir bile, birkaç etiketleri için çalışacağız.

Eğer forum / tartışma panosu çeşit inşa ediyoruz, ve ilgili etiketlerine göre bir yönetim kurulu / forum ile ilgili konuda yazılmıştır tüm etiketleri, yani eğer sadece hepsini seçmek daha kolay would't olur? Eğer iplik üzerinde dayalı etiketleri oluşturmak yana sadece hepsini almak zorunda, hepsi doğru, konulmalıdır.

Ayrıca, ben sadece onlar ilk etapta gerekli konum kez gelecekte arama için bu tablodaki dizi tasarruf ve bazı yeni zaman bu güncelleme, "ile ilgili etiketler" depolamak bu amaç için geçici bir tablo oluşturmak öneririm kelimesi bir etiket olarak verilir.