|
|
|
|
|
для: 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 в 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";
}
}
|
вроде работает так как задумывалось. | |
|
|
|
|
|
|
|
для: 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);
|
как теперь все выводить? | |
|
|
|
|
|
|
|
для: 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-таблицах. | |
|
|
|
|
|
|
|
для: dirol
(03.03.2011 в 11:45)
| | А это полнотекстовый поиск - он вообще не заготовляет ключевые слова, поиск ведется прямо по тексту, индексированному индексом FULLTEXT.
Т.е. вы тоже можете текст новостей проиндексировать и искать наиболее релевантные ссылки при помощи механизма полнотекстового поиска. | |
|
|
|
|
|
|
|
для: 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'] );
|
может на его примере сделать поиск по ключевым словам? что скажите? | |
|
|
|
|
|
|
|
для: dirol
(03.03.2011 в 11:33)
| | Это не совсем глупо - это как раз более нормализированный вариант - вы получаете возможность искать не по тексту, а по цифрам, а это всегда быстрее, учитывая, какое количество поисковых подзапросов набегает. | |
|
|
|
|
|
|
|
для: cheops
(02.03.2011 в 17:40)
| | в нем тупо все сделано, третья таблица соединяется с текстом. так что рабочих получается две таблицы. в одной новость, во второй ключевые слова. | |
|
|
|
|
|
|
|
для: dirol
(02.03.2011 в 17:35)
| | У них, кстати, видите 3 таблицы, а не 2 как у нас (у вас эта CMS под рукой, посмотрите, что это за таблицы и как они устроены). | |
|
|
|
|
|
|
|
для: 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
|
его можно под мои условия передать? | |
|
|
| |
|