mysql поиск

Апокалипсис

тех дир matras.ru
mysql поиск

Доброе время суток!
Имеется таблица.
Структура:
ItemId - id товара
FieldId - id - поля
Value - текст поля

FieldId - имеет 3 записи на товар:
- модель
- вендор
- описание.
(т.е. 3 - модель, 180 - вендор, 4 - описание)

Нужно как то осуществить поиск сразу по 3 полям.
Делаю так:
[sql]
WHERE (FieldId=3 or FieldId=180 or FieldId=4) AND Value LIKE '%".$test."%'";
[/sql]
Находит только допустим tefal, а tefal тостер - уже не находит естественно.
Скорее всего вопрос тупой - не спавши сутки работаю - попалось оч. глючное двигло а сдать нужно сегодня.
Спасибо кто поможет...
Как я понимаю тут нужен fulltext? или как то представить в запросе все 3 поля - как одно?...
Сорри за тупой вопрос, но я уже в ауте...


[sql]
CREATE TABLE IF NOT EXISTS `ru__catalog_itemdetailes` (
`ItemId` int(11) NOT NULL default '0',
`FieldId` int(11) NOT NULL default '0',
`Value` text,
`Fixed` int(1) default '0',
PRIMARY KEY (`ItemId`,`FieldId`),
KEY `Fixed` (`Fixed`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
[/sql]

Часть данных:
[sql]
(2, 4, 'хороший тостер', 0),
(2, 3, 'Tefal', 0),
(2, 180, '539646', 0),[/sql]
 

Glazyrin Sergey

Новичок
Вы можете изложить задачу более подробно с полной структурой таблиц, чтобы можно было вникнуть ?
Тогда может чем то помогу
 

Апокалипсис

тех дир matras.ru
тьфу опечатался. заместо and = or

-~{}~ 22.01.09 19:33:

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

Glazyrin Sergey

Новичок
Btw, x-yuri правильно сказал
SELECT *
FROM test
WHERE FieldId
IN ( 3, 4, 180 )
AND Value LIKE '%tefal%'

Незнаю то ли вы ищите ?
 

x-yuri

Новичок
зачем тебе 3 записи под один товар?
приведи код запроса, как он выглядит перед отправкой в бд для конкретного искомого слова, а не из php кода выдранный
 

Апокалипсис

тех дир matras.ru
Glazyrin Sergey
так работает, но если tefal - это вендор, а тостер - это описание, то нет. т.е. запрос tefal тостер - уже не катит.

зачем тебе 3 записи под один товар?
двигло не моё, такова структура.
[sql]
SELECT *
FROM test
WHERE FieldId
IN ( 3, 4, 180 )
AND Value LIKE '%tefal тостер%'
[/sql]
по тостер - отдельно ищет всё ок.
Мне кажется нужно представить как то все 3 FieldId как одно поле - или мне пора вообще идти спать сегодня.
 

Glazyrin Sergey

Новичок
SELECT *
FROM test
WHERE FieldId
IN ( 3, 4, 180 )
AND Value LIKE '%tefal тостер%'

Результаты
2 4 tefal тостер 0

Что то не то с кодировкой
И следите пожайлуста за терминами, которые используете
Glazyrin Sergey
так работает, но если tefal - это вендор, а тостер - это описание, то нет. т.е. запрос tefal тостер - уже не катит.


У вас это просто строка, какая разница кто там вендор кто еще что то :)
 

x-yuri

Новичок
ищи товар, у которого вендор - 'tefal', а в описании - 'тостер'
а не запись, у которой в поле Value находится 'tefal тостер'
 

Апокалипсис

тех дир matras.ru
x-yuri
это ясно, но нужен полноценный поиск.
Юзер может ввести и тостер tefal и tefal 539646

-~{}~ 22.01.09 19:42:

Ладно, удаляю тему. - сделаю по другому, тут я протупил.
 

Glazyrin Sergey

Новичок
Весело :)
Тогда вам надо над структурой данных подумать как представить данные здесь
 

Апокалипсис

тех дир matras.ru
мда мне точно спать пора идти)

-~{}~ 24.01.09 00:16:

Верну тему.
Помог HraKK:

PHP:
$word = 'tefal тостер';
$array = explode( ' ', $word );
$count = count( $array );
if( $count > 0)
{
    $having = '';
    for ($i = 0; $i< $count;$i++)
    {
        $i AND $having .= ' AND ';
        $having .= ' `Values` LIKE "%'.$array[$i].'%"';
    }
}
$result = mysql_query( "SELECT `ru__catalog_itemdetailes`.`ItemId`, CONCAT_WS(' ', `ru__catalog_itemdetailes`.`Value`, `r1`.`Value`, `r2`.`Value`) AS `Values` FROM `ru__catalog_itemdetailes` LEFT JOIN `ru__catalog_itemdetailes` as `r1` ON `ru__catalog_itemdetailes`.`ItemId` = `r1`.`ItemId` AND `r1`.`FieldId` = 4 AND `ru__catalog_itemdetailes`.`FieldId` = 3 LEFT JOIN `ru__catalog_itemdetailes` as `r2` ON `ru__catalog_itemdetailes`.`ItemId` = `r2`.`ItemId` AND `r2`.`FieldId` = 180 HAVING $having" );
=)))
 
Сверху