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

Форум MySQL

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

 

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

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

тема: Сопаставить два запроса айди
 
 автор: ntro123   (10.06.2013 в 20:36)   письмо автору
 
 

Добрый день, не могу придумать оптимальное решение для следящей задачи: на сайте 500 статей, в у каждой статьи есть поле keyword (varchar 250), в нем храниться ключевые слова статьи. На странице со статьями есть блок «похожие статьи» там выводиться 5 схожих статей, схожесть статей вычисляется методом шинглов (число от 0 до 1, можно до множить на 100, чтобы в поле заносить целое число), все это дело вычисляется на ходу, понятное дело процесс вычисления трудоемкий для сервера и страницы со статьями с каждой новой статьей будут грузиться дольше, решил создать новую таблицу где будет для каждого ID статьи хранится ТОП 5 статей, чтобы не вычислять каждый раз, а по быстрому извлекать из БД нужную инфу (при добавлении статьи все данные будут пересчитываться и заново заноситься в таблицу).
Как решить задачу более рационально?
Если делать БД где id1 (айди первой статьи), id2 (айди второй статьи), procent (процент схожести статей), то один к одному заносить статьи, т.е. место:
Id1    id2    procent
456    789    89
789    456    89

Сокращу до одной записи:
Id1    id2    procent
456    789    89

Как сделать такой запрос, чтобы извлекал, когда я не знаю где будет стоять айди в поле id1 или в id2? (все поняли о чем я?)
Извиняюсь за много букв.

  Ответить  
 
 автор: cheops   (10.06.2013 в 21:40)   письмо автору
 
   для: ntro123   (10.06.2013 в 20:36)
 

Погодите, а почему ключевые слова прямо в таблице стетей? и почему это поле varchar? Может вынести не ТОП 5 статей, а сами ключевые слова? Причем слова в отдельную таблицу, а связи статей с ними в другую? Тогда у вас все операции будут сводиться к этой промежуточной таблице, где ничего кроме внешних ключей (целых чисел) нет. И все будет довольно шустро работать (особенно на таком небольшом объеме).

  Ответить  
 
 автор: ntro123   (10.06.2013 в 22:10)   письмо автору
 
   для: cheops   (10.06.2013 в 21:40)
 

Объем будет расти до несколько тысяч.

varchar потому что ключевые слова умещаются в 250 символов.
потому что при извлечении статей на страницу мета тег кейвордс заполняется этим полем.

"Может вынести не ТОП 5 статей, а сами ключевые слова?"
смысле? зачем? объем будет в разы больше.

Будет все тоже самое, но структура будет такой:
id статьи, кейвордс, процент схожести.

Все тоже самое, но место int поля будет varchar.

Может я не правильно как-то описал задачу?

Нужно провести сложную операцию (сложная т.к. в mysql такое не провернуть), вычислить схоесть между всеми статьями, и когда скажем извлекают статью номер 123 то из таблицы схожести дать все записи где встречается в поле id1 или id2, но проблема в том что, чтобы сэкономить место я не буду делать запросу 1 к 1, а то получится что при 500 статей таблица будет размером в 500*5=2500, а если сократить, то так чтобы запись была место:
id1    id2    procent
224    1    89
224    2    11
224    3    10
1    224    89
1    888    98
1    452    99
...



id1    id2    procent
224    1    89 // убираем это поле т.к. оно уже есть
224    2    11
224    3    10
1    224    89 // вот тут.
1    888    98
1    452    99
...



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

  Ответить  
 
 автор: ntro123   (10.06.2013 в 22:19)   письмо автору
 
   для: ntro123   (10.06.2013 в 22:10)
 

Принципе решение простое:

<?php
...

$article_id=123;

mysql_query("SELECT id1,id2 FROM table WHERE id1=".$article_id." OR id2=".$article_id." ORDER BY procent");

?>


И дальше сранивать не равнел ли $article_id id1 или id2 ... в целом пойдем, но мб есть вообще кардинально другое решение?

  Ответить  
 
 автор: DangerBay   (11.06.2013 в 04:35)   письмо автору
 
   для: ntro123   (10.06.2013 в 22:19)
 

А просто кешировать блок «похожие статьи» для каждой статьи не судьба? Обновления раз в день или как часто добавляются новые статьи вполне достаточно.

  Ответить  
 
 автор: Sfinks   (11.06.2013 в 09:07)   письмо автору
 
   для: ntro123   (10.06.2013 в 22:19)
 

SELECT id
FROM( SELECT id2 as id, procent FROM tbl WHERE id1=224
        UNION
      SELECT id1, procent FROM tbl WHERE id2=224
)t
ORDER BY procent DESC
LIMIT 5
не проверял, но должно работать.

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

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