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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: помогите доработать ключевые слова

Сообщения:  [1-10]    [11-20]   [21-30]  [31-32] 

 
 автор: dirol   (04.03.2011 в 12:36)   письмо автору
 
   для: dirol   (03.03.2011 в 15:52)
 

может кому пригодится

      $result = mysql_query("SELECT cid FROM tags WHERE tags IN (SELECT tags FROM tags WHERE cid=51) AND cid != 51 GROUP BY cid having count(*) >= 2", $sql2);
       while (list($cid) = mysql_fetch_array($result)) {
        echo "$cid<br />\n";

       }

  Ответить  
 
 автор: dirol   (03.03.2011 в 15:52)   письмо автору
 
   для: dirol   (03.03.2011 в 12:27)
 

незнаю по уму или через иное место, во общем сделал так


$id=intval($_GET['id']); // ID Новости передается гетом
  $ids=71; // времмено присвоим номер
  $result = mysql_query("SELECT id, cid, tags FROM tags WHERE cid ='$ids'", $sql2);
  while (list($id, $cid, $tags) = mysql_fetch_array($result)) {
    $mass2[]=$tags;;
  }

  $order = array();
  if(!empty($mass2)){
     for($i = 0; $i < count($mass2); $i++){

        if (count($mass2)==2){
            $incl = "AND";
        } else {
            $incl = "OR";
        }

       $order[] = "id IN (SELECT DISTINCT cid FROM `tags` WHERE tags = '".$mass2[$i]."')";


     }
  }

  if(!empty($order)){
     $query = "SELECT id, cid, title FROM news WHERE id!='$ids' AND ".implode(" $incl ", $order);
     $result3 = mysql_query($query, $sql2);
     if(!$result3) exit("Ошибка - ".mysql_error());
     while (list($id, $cid, $title) = mysql_fetch_array($result3)) {
         echo "$id, $cid, $title<br />\n";
     }
  }

вроде работает так как задумывалось.

  Ответить  
 
 автор: dirol   (03.03.2011 в 12:27)   письмо автору
 
   для: cheops   (03.03.2011 в 11:51)
 

так а если сделать как раньше говорили три таблицы?

первая в ней новости

-- 
-- Структура таблицы `news` 
-- 

CREATE TABLE IF NOT EXISTS `news` ( 
  `id` int(11) NOT NULL auto_increment, 
  `cid` int(11) default '0', 
  `title` varchar(299) default NULL, 
  `time` datetime default NULL, 
  `hometext` text, 
  `status` int(1) NOT NULL default '0', 
  `keywords` varchar(300) NOT NULL, 
  PRIMARY KEY  (`id`), 
  KEY `catid` (`cid`) 
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=82 ; 

-- 
-- Дамп данных таблицы `news` 
-- 

INSERT INTO `news` (`id`, `cid`, `title`, `time`, `hometext`, `status`, `keywords`) VALUES 
(31, 0, 'заголовок 1', '2011-03-01 17:29:26', NULL, 0, 'сша, россия, италия'), 
(41, 0, 'заголовок 2', '2011-03-01 17:29:26', NULL, 0, 'сша, россия, италия'), 
(51, 0, 'заголовок 3', '2011-03-01 17:29:26', NULL, 0, 'россия, сша, италия'), 
(61, 0, 'заголовок 4', '2011-03-01 17:29:26', NULL, 0, 'италия, россия, сша'), 
(71, 0, 'пппппппппппппппппппппппп', '2011-03-01 17:36:51', 'ппппппппппппппппп', 0, 'россия, япония, курилы, италия'), 
(81, 0, 'аааааааааааааа', NULL, NULL, 0, 'россия, курилы, япония');


вторая это сами теги и номера новостей

-- 
-- Структура таблицы `tags` 
-- 

CREATE TABLE IF NOT EXISTS `tags` ( 
  `id` int(11) NOT NULL auto_increment, 
  `cid` int(11) default '0', 
  `tags` varchar(300) NOT NULL, 
  PRIMARY KEY  (`id`), 
  KEY `catid` (`cid`) 
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=192 ; 

-- 
-- Дамп данных таблицы `tags` 
-- 

INSERT INTO `tags` (`id`, `cid`, `tags`) VALUES 
(91, 51, 'россия'), 
(101, 51, 'сша'), 
(111, 21, 'сша'), 
(121, 51, 'япония'), 
(131, 21, 'россия'), 
(141, 71, 'италия'), 
(151, 71, 'сша'), 
(161, 71, 'россия'), 
(171, 41, 'сша'), 
(181, 41, 'италия'), 
(191, 41, 'россия');


и третья получается в ней id тегов и id новостей так получается?


CREATE TABLE IF NOT EXISTS `tag_id` ( 
  `id` int(11) NOT NULL auto_increment, 
  `cid` int(11) default '0', 
  `tags` int(11) default '0',
  PRIMARY KEY  (`id`), 
  KEY `catid` (`cid`) 
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251; 

-- 
-- Дамп данных таблицы `tag_id` 
-- 

INSERT INTO `tag_id` (`id`, `cid`, `tags`) VALUES 
(1, 51, 91), 
(2, 51, 101), 
(3, 21, 111), 
(4, 51, 121), 
(5, 21, 131), 
(6, 71, 141), 
(7, 71, 151), 
(8, 71, 161), 
(9, 41, 171), 
(10, 41, 181), 
(11, 41, 191);


как теперь все выводить?

  Ответить  
 
 автор: cheops   (03.03.2011 в 11:51)   письмо автору
 
   для: dirol   (03.03.2011 в 11:45)
 

Только вам придется скорее всего использовать логический режим, чтобы жестко задать вхождение ключевых слов при помощи суффикса +. Т.е. что-то вроде
SELECT * FROM news
WHERE MATCH (title,hometext) AGAINST ('+россия +сша' IN BOOLEAN MODE)

PS По полям title,hometext, конечно, нужно создать полнотекстовый индекс, иначе поиск производиться не будет. Можно, кстати, искать не по всему тексту, а по ключевым словам, раз уж они у вас все-равно есть. Тогда потребуется создать отдельный индекс по нему и прописать название keyword вместо title,hometext. Да, полнотекстовый индекс работает только с полями семейства TEXT и только в MyISAM-таблицах.

  Ответить  
 
 автор: cheops   (03.03.2011 в 11:47)   письмо автору
 
   для: dirol   (03.03.2011 в 11:45)
 

А это полнотекстовый поиск - он вообще не заготовляет ключевые слова, поиск ведется прямо по тексту, индексированному индексом FULLTEXT.

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

  Ответить  
 
 автор: dirol   (03.03.2011 в 11:45)   письмо автору
 
   для: cheops   (03.03.2011 в 11:39)
 

все равно не понимаю. извините конечно.

а вот запрос в dle

$db->query( "SELECT id, title, date, category, alt_name, flag
FROM " . PREFIX . "_post 
WHERE MATCH (title, short_story, full_story, xfields) 
AGAINST ('$body') AND id != " . $row['id'] . " AND approve='1'" . $where_date . " 
LIMIT " . $config['related_number'] );

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

  Ответить  
 
 автор: cheops   (03.03.2011 в 11:39)   письмо автору
 
   для: dirol   (03.03.2011 в 11:33)
 

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

  Ответить  
 
 автор: dirol   (03.03.2011 в 11:33)   письмо автору
 
   для: cheops   (02.03.2011 в 17:40)
 

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

  Ответить  
 
 автор: cheops   (02.03.2011 в 17:40)   письмо автору
 
   для: dirol   (02.03.2011 в 17:35)
 

У них, кстати, видите 3 таблицы, а не 2 как у нас (у вас эта CMS под рукой, посмотрите, что это за таблицы и как они устроены).

  Ответить  
 
 автор: dirol   (02.03.2011 в 17:35)   письмо автору
 
   для: cheops   (02.03.2011 в 16:59)
 

вот от друпала код


$tag = 'новость'; // Настраиваем нужный тег. Если нужен вывод материалов по нескольким терминам, то вместо этого кода пишем следующий:
//$tags = "'термин1','термин2','термин3'";

$count = 5; // Максимальное количество выводимых нод.


$result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title
FROM {node} n
INNER JOIN {term_node} tn ON n.nid = tn.nid
INNER JOIN {term_data} td ON tn.tid = td.tid
WHERE td.name = '%s' AND
n.status = 1
ORDER BY n.created DESC"),$tag,0,$count);

while ($node = db_fetch_object($result)) {
  $items[] = l($node->title, 'node/'. $node->nid);
}
$output = theme('item_list', $items);
print $output;

http://www.drupalka.ru/node/31


его можно под мои условия передать?

  Ответить  

Сообщения:  [1-10]    [11-20]   [21-30]  [31-32] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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