SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.04.2012 15:46:28

slipkahh
Участник
Зарегистрирован: 13.04.2012
Сообщений: 12

Выборка по тэгам.

Доброго времени суток.
Есть проектик, основной контент - трехстрочные текстики по ~150 символов. Таковых порядка 100тыс., для каждого из них есть тэги (от 1 до 5 тэгов). Разных тэгов около 7тыс.
Сейчас нужно реализовать функционал выборки текстов по тэгу.

Как работает на пальцах: при клике на тэг вызывается .php скрипт, в котором делается mysql выборка 10 текстов по тэгу.

Вопрос: как правильнее организовать таблицы?
Думается мне примерно так:    id - text - tag1 - tag2 - tag3 - tag4 -tag5 для каждого текста.
Как в этом случае делать SELECT, ведь один и тот же тэг в разных строках может быть в разных столбцах?

Или я в корне не правильно мыслю и нужно как-то по-другому?

Спасибо за внимание!

Отредактированно slipkahh (13.04.2012 15:46:51)

Неактивен

 

#2 13.04.2012 21:55:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка по тэгам.

Две таблицы:
id - text
и
tag - id_из_первой_таблицы


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

Неактивен

 

#3 14.04.2012 17:50:46

slipkahh
Участник
Зарегистрирован: 13.04.2012
Сообщений: 12

Re: Выборка по тэгам.

Спасибо за ответ.
Вы советуете сделать вторую таблицу вида (id - tag_name - s_id), где s_id указывает на строку в первой таблице. Так? Но тогда возникает 2 момента.
1) При 100.000 записей в первой таблице будет до 500.000 записей во второй, ибо на каждый текст приходится до 5 тэгов. Надо будет резать на несколько таблиц или mysql справится без напрягов?
2) В скрипт передается id тэга, этому id соответствует лишь одно значение s_id.
Т.е. максимум, что я получу - это один текст. Мне же нужны все.
Как правильно выйти из этой ситуации? Перейти к виду таблицы ( tag_name - s_id ) и передавать в скрипт не id тэга, а его его имя? Запрос примерно такой будет:

SELECT * FROM TEXT_TABLE WHERE id IN (SELECT s_id FROM TAG_TABLE WHERE tag_name=полученное_имя_тэга)
.


В моем варианте из первого поста темы будет что-то вроде
SELECT * FROM TEXT_TABLE WHERE (tag1="полученный_ид_тэга") OR (tag2="полученный_ид_тэга") OR (tag3="полученный_ид_тэга") OR (tag4="полученный_ид_тэга") OR (tag5="полученный_ид_тэга");


При это вторая таблица TAG_TABLE будет вида (id tag_name) и будет содержать не около 500.000 записей, а всего 7.000, что по-моему сыграет роль при выводе на полотенце всех уникальных тэгов.

Финальный вопрос: какой из вариантов будет быстрее и где я не прав?

Спасибо большое за помощь и простите за нубские вопросы. Еще не совсем освоился.

Неактивен

 

#4 14.04.2012 18:29:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка по тэгам.

slipkahh написал:

Спасибо за ответ.
Вы советуете сделать вторую таблицу вида (id - tag_name - s_id), где s_id указывает на строку в первой таблице. Так?

id лишний.

slipkahh написал:

1) При 100.000 записей в первой таблице будет до 500.000 записей во второй, ибо на каждый текст приходится до 5 тэгов. Надо будет резать на несколько таблиц или mysql справится без напрягов?

Не надо резать.

slipkahh написал:

2) В скрипт передается id тэга, этому id соответствует лишь одно значение s_id.
Т.е. максимум, что я получу - это один текст. Мне же нужны все.
Как правильно выйти из этой ситуации? Перейти к виду таблицы ( tag_name - s_id ) и передавать в скрипт не id тэга, а его его имя?

Сделать вторую таблицу вида (tag_id, s_id). В этом случае по заданному tad_id вы найдете набор s_id

select набор_нужных_полей from TEXT_TABLE t1 join TAG_TABLE t2 on t1.id=t2.s_id where tag_id=переданное_в_скрипит_значение;

Обратите внимание:
1. Писать подзапрос в in (как в вашем примере) очень плохая мысль, так как он будет выполняться для каждой строки основного запроса.
2. Не стоит писать *, явно перечисляйте нужные поля.

Неактивен

 

#5 14.04.2012 19:56:40

slipkahh
Участник
Зарегистрирован: 13.04.2012
Сообщений: 12

Re: Выборка по тэгам.

Выручили, спасибо!

Неактивен

 

#6 15.04.2012 18:57:26

slipkahh
Участник
Зарегистрирован: 13.04.2012
Сообщений: 12

Re: Выборка по тэгам.

vasya, мне снова нужен ваш совет. С предыдущим всё не так гладко.
Есть как выборка текстов по тэгу, так тэгов по тексту.*
Если на пальцах, то использование такое: при выводе текста на страницу выводятся и связанные с ним тэги (от 1 до 5), а при клике на тэг выбираются тексты, содержащие этот тэг. Текстов, соответствующих выбранному тэгу, может быть довольно много.

При такой выборке 10 текстов:

select text,tag_name from STATUS_TABLE t1 join TAG_TABLE t2 on t1.id=t2.s_id where id='$r_a'
, где $r_a - случайное число.
Получаю на выходе что-то вроде этого: скриншот - http://clip2net.com/s/1OpbE
Хотя например Тексту2 (выделен красным) соответствуют 4 тэга в таблице.
Вопрос: как выбрать все тэги? Как сделать это при такой структуре я придумал.

*В таблицу TAG_TABLE пришлось добавить столбец tag_id, т.к. tag_name и s_id могут повторяться, и, соотв., не могут быть PRIMARY KEY.

Еще раз большое спасибо!

Неактивен

 

#7 15.04.2012 19:34:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка по тэгам.

slipkahh написал:

*В таблицу TAG_TABLE пришлось добавить столбец tag_id, т.к. tag_name и s_id могут повторяться, и, соотв., не могут быть PRIMARY KEY.

В моем примере таблица TAG_TABLE имеет (tag_id, s_id)

Поиск тегов по тексту:

select набор_нужных_полей from TAG_TABLE where s_id=id_текста_по_которому_ищем_теги;

или

select набор_нужных_полей from TEXT_TABLE t1 join TAG_TABLE t2 on t1.id=t2.s_id where t1.`text`='текст_по_которому_ищем_теги';

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson