|
|
|
| Добрый солнечный день.
Список документов:
Name 001.doc|Семестровая, Высшая математика
Name 002.doc|Реферат
Name 003.doc|Семестровая
Name 004.doc|Диплом, Бизнес-план, Боговик
Name 005.doc|Курсовая работа, Высшая математика, Боговик
Name 006.doc|Семестровая, Философия, Аристотель
Name 007.doc|Высшая математика, Курсовая работа
|
Когда я просматирваю документ Name 005.doc мне нужно, чтобы в блоке "Похожие документы" мне вывелись следующие в порядке очереди:
Name 007.doc
Name 001.doc
Name 004.doc
|
То есть все манипулиции (поиск похожих документов) нужно проводить при помощи записанных тегов для каждого документа.
Как это реализовать на примере?
P. S. Данные записаны в таблице MySQL:
| |
|
|
|
|
|
|
|
для: Udachix
(13.03.2013 в 16:14)
| | Если ничего не изобретать с изменением схемы хранения данных, то можно попробовать как-то так:
SELECT id,name, tags,
100 * IF(FIND_IN_SET('Курсовая работа', REPLACE(tags,', ',',')), 1,0) +
10 * IF(FIND_IN_SET('Высшая математика', REPLACE(tags,', ',',')), 1, 0) +
IF(FIND_IN_SET('Боговик', REPLACE(tags,', ',',')), 1, 0) AS rang
FROM test
WHERE id <> 5
HAVING rang > 0
ORDER BY rang DESC
|
понятно, что
100 * IF(FIND_IN_SET('Курсовая работа', REPLACE(tags,', ',',')), 1,0) +
10 * IF(FIND_IN_SET('Высшая математика', REPLACE(tags,', ',',')), 1, 0) +
IF(FIND_IN_SET('Боговик', REPLACE(tags,', ',',')), 1, 0) AS rang
| надо динамически генерировать на основе тэгов текущего документа.
PS. Возможно следует добавить поле в таблицу, в котором записывать ID похожих документов, чтобы каждый раз при выборке не сканить всю таблицу. Однако, в таком случае придется при изменении/добавлении/удалении документа - пересчитывать эти поля | |
|
|
|
|
|
|
|
для: Igorek
(14.03.2013 в 09:39)
| | Спасибо, буду думать. | |
|
|
|
|
|
|
|
для: Igorek
(14.03.2013 в 09:39)
| | Быть может мне саму структуру сменить? На какую-нибудь более эффективную для такого поиска. | |
|
|
|
|
|
|
|
для: Igorek
(14.03.2013 в 09:39)
| | Да, всё заработало, когда окончательно вставил в свой код.
Вот теперь, правда, есть вопрос, как изменить Ваш вариант, если изменить структуру хранения данных на:
table `documents`
`id` | `name`
table `tags`
`id` | `tagname` | `id_document`
|
То есть каждый тег хранить как отдельную запись в таблице тегов.
Или в этом случае 100, 10 и 1 не будут актуальны и результаты изменяться? | |
|
|
|
|
|
|
|
для: Udachix
(16.03.2013 в 21:32)
| | Не могли бы ещё подсказать по этому вот поводу. | |
|
|
|
|
|
|
|
для: Udachix
(16.03.2013 в 21:32)
| | Т.е. теперь порядок тегов уже не важен? Не вижу поля типа order.
Может это еще поможет http://softtime.ru/forum/read.php?id_forum=3&id_theme=89177 | |
|
|
|
|
|
|
|
для: Igorek
(17.03.2013 в 16:24)
| | Да, неплохой вариант, но в ответе от Sfinks я не всё понял в синтаксисе. Видимо, мне ещё нужно много изучать в SQL.
Вот, например:
t1.tid
ORDER BY 3 DESC
SELECT t2.tid id
И так полей в таблице минимум, почему нельзя по всем пройтись и зачем эти постоянные замены на короткие имена в виде t, t1? | |
|
|
|
|
|
|
|
для: Udachix
(18.03.2013 в 00:20)
| | Вопрос лучше бы там и задать...
order by 3 - сортировать по третьему полю в выборке.
SELECT t2.tid id тоже, что и SELECT t2.tid AS id
см. синтаксис select'a
короткие имена здесь обязательны, т.к. таблица джоинится сама на себя. как иначе понять из какой "версии" таблицы брать поле? | |
|
|
|