Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Расчёт похожих документов на PHP
 
 автор: Udachix   (13.03.2013 в 16:14)   письмо автору
 
 

Добрый солнечный день.

Список документов:
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:
id | name | tags

  Ответить  
 
 автор: Igorek   (14.03.2013 в 09:39)   письмо автору
 
   для: 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 похожих документов, чтобы каждый раз при выборке не сканить всю таблицу. Однако, в таком случае придется при изменении/добавлении/удалении документа - пересчитывать эти поля

  Ответить  
 
 автор: Udachix   (14.03.2013 в 10:17)   письмо автору
 
   для: Igorek   (14.03.2013 в 09:39)
 

Спасибо, буду думать.

  Ответить  
 
 автор: Udachix   (14.03.2013 в 10:33)   письмо автору
 
   для: Igorek   (14.03.2013 в 09:39)
 

Быть может мне саму структуру сменить? На какую-нибудь более эффективную для такого поиска.

  Ответить  
 
 автор: Udachix   (16.03.2013 в 21:32)   письмо автору
 
   для: Igorek   (14.03.2013 в 09:39)
 

Да, всё заработало, когда окончательно вставил в свой код.

Вот теперь, правда, есть вопрос, как изменить Ваш вариант, если изменить структуру хранения данных на:
table `documents`
`id` | `name`

table `tags`
`id` | `tagname` | `id_document`

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

Или в этом случае 100, 10 и 1 не будут актуальны и результаты изменяться?

  Ответить  
 
 автор: Udachix   (17.03.2013 в 14:36)   письмо автору
 
   для: Udachix   (16.03.2013 в 21:32)
 

Не могли бы ещё подсказать по этому вот поводу.

  Ответить  
 
 автор: Igorek   (17.03.2013 в 16:24)   письмо автору
 
   для: Udachix   (16.03.2013 в 21:32)
 

Т.е. теперь порядок тегов уже не важен? Не вижу поля типа order.

Может это еще поможет http://softtime.ru/forum/read.php?id_forum=3&id_theme=89177

  Ответить  
 
 автор: Udachix   (18.03.2013 в 00:20)   письмо автору
 
   для: Igorek   (17.03.2013 в 16:24)
 

Да, неплохой вариант, но в ответе от Sfinks я не всё понял в синтаксисе. Видимо, мне ещё нужно много изучать в SQL.

Вот, например:
t1.tid
ORDER BY 3 DESC
SELECT t2.tid id

И так полей в таблице минимум, почему нельзя по всем пройтись и зачем эти постоянные замены на короткие имена в виде t, t1?

  Ответить  
 
 автор: Igorek   (18.03.2013 в 07:28)   письмо автору
 
   для: Udachix   (18.03.2013 в 00:20)
 

Вопрос лучше бы там и задать...
order by 3 - сортировать по третьему полю в выборке.
SELECT t2.tid id тоже, что и SELECT t2.tid AS id
см. синтаксис select'a

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования