2009-10-16 2 views
0

Есть 4 таблицы, используемые для хранения тегов:метки Php дисплей

tagovi, tagovi_vijesti, tagovi_blogovi, tagovi_dogadjanja 

Структура О.Д. таблицы tagovi:

id - name 

Структура таблицы tagovi_vijesti:

id - vijesti_id - tag_id 

То же самое для другие две таблицы.

На главной странице я отображать тег из всех трех таблиц таким образом:

$sql = "SELECT 
      T.id AS id, T.name AS tag, 
      TV.id AS tag_vijest_id, TD.id AS tag_dogadjanje_id, TB.id AS tag_blog_id, 
      COUNT(*) ponavljanje 
      FROM tagovi AS T 
      LEFT JOIN tagovi_vijesti AS TV ON T.id = TV.tag_id 
      LEFT JOIN tagovi_dogadjanja AS TD ON T.id = TD.tag_id 
      LEFT JOIN tagovi_blogovi AS TB ON T.id = TB.tag_id 
      WHERE TV.id IS NOT NULL 
      GROUP BY id 
      ORDER BY id DESC 
      LIMIT 35"; 
    $sql_result = mysql_query($sql,$connect) 
     or die("Upit nije izvrsen"); 

    while ($row = mysql_fetch_array($sql_result)){ 
     $tag_id = $row["id"]; 
     $tag_url = $row["tag"]; 
     $tag = preg_replace('/-/', ' ', $tag_url); 
     $tag_ponavljanje = $row["ponavljanje"]; 

     if($tag_ponavljanje >= 10 && $tag_ponavljanje < 20) $fontSize = "14px"; 
     elseif($tag_ponavljanje >= 20 && $tag_ponavljanje < 30) $fontSize = "16px"; 
     elseif($tag_ponavljanje >= 30 && $tag_ponavljanje < 40) $fontSize = "18px"; 
     elseif($tag_ponavljanje >= 40 && $tag_ponavljanje < 60) $fontSize = "20px"; 
     elseif($tag_ponavljanje >= 60) $fontSize = "24px"; 
     else $fontSize = "12px"; 

     echo " &nbsp; <a href = \"$ispisi_link/tag/$tag_url\" style=\"font-size: $fontSize;\">$tag</a> &nbsp; "; 
    } 

Но я не думаю, что это идеальный способ сделать это, потому что теги сортируются по идентификатору, а затем все эти старый теги больше никогда не будут отображаться, потому что результаты сортируются по id. Какой экран (запрос) вы используете? Что бы вы посоветовали мне показывать теги? Лучше ли сортировать их по количеству повторений каждого тега (в моей таблице повторение называется «понавляние»)? Если я использую этот путь, то я немного боюсь, что будут теги, которые будут повторяться в большинстве контента, и новый никогда не будет отображаться на главной странице. Или я могу использовать два запроса, один для новых тегов и один для тех, кто в основном используется?

Спасибо, Ile

+2

Я думаю, что этот пример показывает, почему предпочтительны имена переменных только для английского. :-P – Tomalak

+2

Я думаю, что нетрудно сделать вывод о том, что означает «tagovi» или «blogovi»: P: D –

+0

@ile +1, но tagovi_vijesti немного сложнее grok –

ответ

1

Пробовали ли вы использовать ORDER BY RAND()? Это может убить ваши перфомансы, но если вы кешируете результат в течение 5 или 10 минут, он должен быть достаточно хорош.

+0

Хмм, я не знал ЗАКАЗАТЬ RAND() настолько плох для производительности, я использую его со списком изображений из фотогалереи, возможно, мне действительно нужно научиться и использовать кеширование. –

2

Вы можете смешивать его, комбинируя оба в один стол (таким образом, у вас есть лучшее из обоих миров).

Итак, если вы собираетесь сделать облако тегов из 20 тегов, выберите 10 наиболее помеченных и 10 случайных.

ORDER BY RAND() будет довольно грубым, если у вас есть много тегов, хотя, как упоминал Арк. В качестве альтернативы вы можете вставить каждый тег со случайным целым числом, а затем индексировать этот столбец. Если вы хотите перетасовать теги позже, вы можете переназначить случайные значения в этом столбце.

+0

Есть ли другой (более простой) способ выбрать 10 наиболее помеченных, а затем выбрать 10 случайных, за исключением 10 самых помеченных, чем это я бы использовал: Идентификаторы магазина из 10 наиболее помеченных в массив, а затем в sql-запросе исключают его с помощью «WHILE foreach ($ ids как $ id) id!= '$ id' "(это просто объяснение семантики, я знаю, что синтаксис неверен :)) И, возможно, я мог бы добавить еще 10 последних тегов, поэтому это было бы общее количество тегов 30 ... Я думаю, что это было бы хорошее решение. Спасибо за помощь;) –

Смежные вопросы