|
|
|
| добрый день!
подскажите, пожалуйста, как можно реализовать "облако тегов" для блога? у меня в Базе данных есть таблица tags: id_tag, word, id_post, где первое поле - первичный ключ с порядковым номером ключевого слова, второе поле - само слово и третье - номер поста в блоге, которому эта метка принадлежит. мне интересно узнать, как сделать все теги разными размерами шрифта (в зависимости от количества употребления этого тега) ну и сама сортировка, конечно.
зараннее благодарен! | |
|
|
|
|
|
|
|
для: Keks
(23.08.2008 в 17:08)
| | как выглядят записи, когда одно слово принадлежит нескольким постам? | |
|
|
|
|
|
|
|
для: Trianon
(23.08.2008 в 17:26)
| | ну когда пользователь пишет новый пост он через запятую записывает в специальное поле ключевые слова, и для каждого записанного ключевого слова в таблице tags в поле id_tag записывается уникальный порядковый номер тега, в поле word - само ключевое слово, а в id_post - номер поста из таблицы posts (там это тоже первичный ключ). то есть одно ключевое слово может встречаться несколько раз. и номер id_post в таблице tags так же может попадаться несколько раз | |
|
|
|
|
|
|
|
для: Keks
(23.08.2008 в 18:08)
| | напрашивается более разумная структура хранения.
words(id_word, word)
tags(id_post, id_word)
SELECT word, cnt
FROM
( SELECT id_word, COUNT(id_post) AS cnt
FROM tags
GROUP BY id_word
HAVING cnt > 4
) AS wc
JOIN words ON words.id_word = wc.id_word
ORDER BY RAND()
|
| |
|
|
|
|
|
|
|
для: Trianon
(23.08.2008 в 18:21)
| | спасибо. а как сделать присвоение стилей тегам которые используются бОльшее количество раз? | |
|
|
|
|
|
|
|
для: Keks
(23.08.2008 в 18:36)
| | Разбить весь спектр частот на диапазоны по числу заведенных стилей.
В самом примитивном случае:
$style_no = 4;
for($counts=array(); $row = mysql_fetch_assoc($res); $counts[$row['word']] = intval($row['cnt']));
$maxcnt = array_max($counts) ;
$mincnt = array_min($counts) ;
$range = $maxcnt -$mincnt +1;
$styles = array();
foreach($counts as $word => $cnt)
{
$style_no = intval(($cnt - $mincnt) / $range);
$styles[$word] = "style$style_no";
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(23.08.2008 в 19:09)
| | в таком случае php жалуется на несуществующие функции array_max() и array_min() :( или их надо писать вручную? | |
|
|
|
|
|
|
|
для: Keks
(24.08.2008 в 20:11)
| | можно просто поменять на max() и min() | |
|
|
|
|
|
|
|
для: Trianon
(24.08.2008 в 20:25)
| | ну в этом худо-бедно разобрался, спасибо Вам большое за помощь :) и еще последний ламерский вопрос: для поля id_word в таблице words надо прописывать первичный ключ и одно и то же слово в эту таблицу можно добавлять несколько раз? или же нельзя допускать дублирования одного и того же слова в таблице words? | |
|
|
|
|
|
|
|
для: Keks
(24.08.2008 в 23:00)
| | В этой таблице столько строк, сколько набралось разных слов.
Зачем добавлять их несколько раз?
Будучи однажды добавленным, слово уже имеет свой id_word
А вот в таблице tags могут повторяться как id_post так и id_word .
Лишь бы не оба сразу.
Можно создать составной ключ на этих двух полях. Уникальный.
И по индексу обычному - на каждое из полей. | |
|
|
|