[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: теги к постам
Crэker
Подскажите как в бд хранить теги к постам пользователей, чтобы можно было подсчитать, сколько раз человек использует тег в постах и по всему сервису какие теги популярней. И еще, чтобы можно было их вообще с постами выводить.
Подскажите, а то плохо чувствую себя, голова не варит вообще unsure.gif sad.gif



Спустя 3 минуты, 9 секунд (15.10.2009 - 11:44) glock18 написал(а):
отдельная таблица для тегов. еще одна для связей с постами.

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

Спустя 12 минут, 18 секунд (15.10.2009 - 11:56) Crэker написал(а):
Цитата (glock18 @ 15.10.2009 - 09:44)
отдельная таблица для тегов. еще одна для связей с постами.

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

Спасибо:)

Спустя 6 часов, 26 минут, 57 секунд (15.10.2009 - 18:23) Crэker написал(а):
Цитата (glock18 @ 15.10.2009 - 09:44)
отдельная таблица для тегов. еще одна для связей с постами.

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

Все же никак.
tegs
teg_id teg_name tag_summ

А как организовать вторую таблицу связку? не могу увязать подсчет количества и отображение тегов в каждом посте

Спустя 8 минут, 20 секунд (15.10.2009 - 18:31) Crэker написал(а):
если сразу хранить теги к посту через запятую, то ни о каком подсчете речи и не идет. а если пост ид_тега счетчик, то к каждому посту придется в лучшем случае запрос делать для тегов

Спустя 8 минут, 44 секунды (15.10.2009 - 18:40) glock18 написал(а):
еще таблица
tag2post

tagId postId


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

Спустя 11 минут, 42 секунды (15.10.2009 - 18:52) Crэker написал(а):
Цитата (glock18 @ 15.10.2009 - 16:40)
еще таблица
tag2post

tagId postId


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

Я не совсем о том, как парсить я и сам знаю.
При такой организации бд можно подсчитать кол-во тегов во всем сервисе, но не в отдельном аккаунте. и главное, как выводить теги в постах? для каждого поста по запросу что ли создавать?

Спустя 1 час, 1 минута, 11 секунд (15.10.2009 - 19:53) glock18 написал(а):
Цитата
При такой организации бд можно подсчитать кол-во тегов во всем сервисе, но не в отдельном аккаунте


если аккаунт == юзер, то можно добавить user2tag.только смысл?

и главное, как выводить теги в постах? для каждого поста по запросу что ли создавать?

можно join + group by + group_concat вместе с самими постами, либо выводить отдельным запросом. только не для каждого поста. одного на все посты хватит за глаза.

Спустя 9 минут, 29 секунд (15.10.2009 - 20:02) Crэker написал(а):
Цитата (glock18 @ 15.10.2009 - 17:53)
Цитата
При такой организации бд можно подсчитать кол-во тегов во всем сервисе, но не в отдельном аккаунте


если аккаунт == юзер, то можно добавить user2tag.только смысл?

и главное, как выводить теги в постах? для каждого поста по запросу что ли создавать?

можно join + group by + group_concat вместе с самими постами, либо выводить отдельным запросом. только не для каждого поста. одного на все посты хватит за глаза.

Никак ты не достанешь теги вместе с постом, только если они в одной строке будут. а потом после запроса эксплодом разбивать.
SQL
SELECT `post_id`,`post_title`,`postcontent`,`post_comments_summ`,`post_date` FROM `posts` WHERE post_owner_diary = $id ORDER BY `post_id` DESC

разве что подзапрос делать,
SQL
SELECT `teg_id`, FROM `posts` WHERE post_id = `post_id`

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

Спустя 16 минут, 13 секунд (15.10.2009 - 20:19) glock18 написал(а):
Цитата
Никак ты не достанешь теги вместе с постом, только если они в одной строке будут. а потом после запроса эксплодом разбивать.


Да ладно? smile.gif
таблицы:
post
post2tag
tag
Вот раз:
SQL
select p.*,
group_concat(tag.name separator ',') as tags,
count(*) as tagCount
from post p
inner join post2tag pt on p.id = pt.postId
inner join tag t on pt.tagId = t.id
where p.id = <whateverYouWant>
group by p.id


Вот два:
выбираешь все теги. собираешь id в массив или строку для in. выбираешь теги, для этих постов.

первый вариант так же, как и второй, подходит для выборки списка постов.

Спустя 19 минут, 6 секунд (15.10.2009 - 20:38) Крекер написал(а):
Сложноватый для меня запрос... завтра с компа буду по косточкам разбирать

Спустя 21 час, 4 минуты, 31 секунда (16.10.2009 - 17:42) Crэker написал(а):
Цитата (glock18 @ 15.10.2009 - 18:19)
Цитата
Никак ты не достанешь теги вместе с постом, только если они в одной строке будут. а потом после запроса эксплодом разбивать.


Да ладно? smile.gif
таблицы:
post
post2tag
tag
Вот раз:
SQL
select p.*,
group_concat(tag.name separator ',') as tags,
count(*) as tagCount
from post p
inner join post2tag pt on p.id = pt.postId
inner join tag t on pt.tagId = t.id
where p.id = <whateverYouWant>
group by p.id


Вот два:
выбираешь все теги. собираешь id в массив или строку для in. выбираешь теги, для этих постов.

первый вариант так же, как и второй, подходит для выборки списка постов.

SQL
SELECT `post_id` , `post_title` , `post_full_content` , `post_comments_summ` , `post_date` , CONVERT( GROUP_CONCAT( `_teg_id` )
USING utf8 ) AS `_post_id` , `teg_name`
FROM `be_posts` LEFT JOIN `be_posts__tegs` ON `post_id` = `_post_id`
LEFT JOIN `be_tegs` ON `_teg_id` = `teg_id`
WHERE `post_owner_diary` =1
GROUP BY `post_id`


сумашедший запрос, к тому же получается так, что выбирается только один тег вместо многих, как исправить?

Спустя 14 минут, 9 секунд (16.10.2009 - 17:56) glock18 написал(а):
ты group_concat по имени забыл (обрати внимание, что у тебя _post_id содержит все три id smile.gif ). вопрос а зачем на лету конвертировать в утф8 ? таблица не в утф?

Запрос кстати не сумасшедший... простенький такой rolleyes.gif у меня по работе проект сейчас, так о таких запросах только мечтать остается... sad.gif если запрос не выбирает справочные данные, то по-любому занимает 1-2 экрана (ну если не лепить все в кучу).

Спустя 2 минуты, 15 секунд (16.10.2009 - 17:59) Crэker написал(а):
Цитата
в утф8 ? таблица не в утф?

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

Спустя 1 минута, 48 секунд (16.10.2009 - 18:00) Crэker написал(а):
Цитата
ты group_concat по имени забыл

напиши пожалуйста как запрос должен выглядеть, я не понял, и полдня уже воюю

Спустя 17 минут, 20 секунд (16.10.2009 - 18:18) glock18 написал(а):
Цитата
если ты доки не читал, то функция работает только с буквенными значениями. а у меня цифры, эта функция преобразовывает их в буквы


аа, это типа еще один вариант "приведения типа". читал доки, конечно. только видимо ты читал невнимательно, потому как convert и cast - две функции, которые могут привести к типу. и не таким способом, $i += 0, !!$i и подобные элементы хардкодинга.

Цитата
напиши пожалуйста как запрос должен выглядеть, я не понял, и полдня уже воюю


SQL
SELECT `post_id`,
`post_title`,
`post_full_content`,
`post_comments_summ`,
`post_date`,
GROUP_CONCAT( `_teg_id` ) AS `post_tag_ids`,
GROUP_CONCAT(`teg_name`) AS `post_tags`
FROM `be_posts` LEFT JOIN `be_posts__tegs` ON `post_id` = `_post_id`
LEFT JOIN `be_tegs` ON `_teg_id` = `teg_id`
WHERE `post_owner_diary` =1
GROUP BY `post_id`


приведение типа там ни к чему.

Спустя 6 минут, 4 секунды (16.10.2009 - 18:24) Crэker написал(а):
Цитата
приведение типа там ни к чему.

еще как к чему, иначе вместо пост_тегс_ид получится BLOB - 5 bytes

Спустя 3 минуты, 14 секунд (16.10.2009 - 18:27) Crэker написал(а):
вот о чем я

Спустя 2 минуты, 35 секунд (16.10.2009 - 18:30) glock18 написал(а):
Crэker
я понимаю, так ведь blob это такой же тип данных, как и любой другой. честно говоря, не уверен, конечно, но думаю, что этот блоб легко прочитается. blob везде так показывается, но ты пробовал в php посмотреть что приходит? ведь:
1,2,3 - 5 байт

Спустя 6 минут, 2 секунды (16.10.2009 - 18:36) Crэker написал(а):
Цитата
но ты пробовал в php посмотреть что приходит?

в php выводит 1,2,3 , но не сами теги

Спустя 2 минуты, 54 секунды (16.10.2009 - 18:39) Crэker написал(а):
ой, извиняюсь, не заметил кое-чего
ну спасибо, здоровски помог:)

Спустя 24 минуты, 50 секунд (16.10.2009 - 19:03) glock18 написал(а):
Цитата
ой, извиняюсь, не заметил кое-чего
ну спасибо, здоровски помог:)

аха smile.gif пожалуйста


_____________
Если есть желание стать соразработчиком инновационного сервиса онлайн дневников, с нетерпением жду вас в личке)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.