
t0th
Membros-
Total de itens
16 -
Registro em
-
Última visita
Tudo que t0th postou
-
Olá, mas acho que isso não resolve meu problema... obrigado
-
Olá, tenho que seguinte situação, temos um comparador de preços, os produtos vem de lojas. Um produto pode vir com nomes diferentes. Exemplo: Notebook apple macbook 15 , esse produto pode vir das lojas com nomes diferentes: NB apple mac-book 15 notebook apple macbook 15 apple notebook mac-book 15 ...assim por diante... podendo ter variações dos nomes entre lojas diferentes. Pergunto: como posso fazer isso? Quando procurar por exemplo: Notebook apple macbook 15 ele mostrar 'esse produto esta em 5 lojas diferentes'. Ele teria que procurar semelhanças entre os nomes dos produtos e eleger quais são os semelhantes. Como posso fazer isso sem que seja um trabalho manual? Att.
-
olá, se tiver alguém que pode me ajudar com esse problema eu pago pelo trabalho... só me mandar uma MP obrigado e espero resposata
-
Olá, modifiquei algumas coisas: CREATE TABLE IF NOT EXISTS `produtos` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `lojas_id` int(10) unsigned NOT NULL DEFAULT '0', `nome` varchar(60) DEFAULT NULL, `codigo` varchar(15) DEFAULT NULL, `preço` varchar(10) DEFAULT NULL, `descc` text, `foto` varchar(200) DEFAULT NULL, `lastUpdate` varchar(22) NOT NULL, PRIMARY KEY (`id`), KEY `prod_nome2` (`nome`), FULLTEXT KEY `prod_nome` (`nome`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=96227 ; essa query: ---------------------- SELECT sql_cache produtos.nome,produtos.preço,lojas.nome as nomeLoja, site, produtos.id FROM produtos inner join lojas on lojas.id = produtos.lojas_id where (LOCATE('hd', produtos.nome) or MATCH (produtos.nome) AGAINST (' "HD EXT" "HD IDE" "HD SATA" "HD SCSI" "HD EXTERNO" "NB HD" "HARD DISK" "HD * P/ NOTEBOO" "HD 160" "HD 1.5TB " "HD 250" "HD 320" "HD 400 " "HD 500" "HD 640" "HD 750" "HD 80" "HD EXT " "HD EXTERNO" "HD IDE" "HD NB" "HD NTB" "HD SATA" "HD SCSI" "HD SSD" "HD USB" "HD-NB" "HD-NOTEBOOK" "NTB HD" ' IN BOOLEAN MODE)) and lojas.publish=1 ORDER BY produtos.nome ----------------------- mesma que: SELECT sql_cache produtos.nome,produtos.preço,lojas.nome as nomeLoja, site, produtos.id FROM produtos inner join lojas on lojas.id = produtos.lojas_id where ( produtos.nome LIKE '%hd%' or produtos.nome LIKE '%HD EXT%' or produtos.nome LIKE '%HD IDE%' or produtos.nome LIKE '%HD SATA%' or produtos.nome LIKE '%HD SCSI%' or produtos.nome LIKE '%HD EXTERNO%' or produtos.nome LIKE '%NB HD%' or produtos.nome LIKE '%HARD DISK%' or produtos.nome LIKE '%HD * P/ NOTEBOO%' or produtos.nome LIKE '%HD 160%' or produtos.nome LIKE '%HD 1.5TB %' or produtos.nome LIKE '%HD 250%' or produtos.nome LIKE '%HD 320%' or produtos.nome LIKE '%HD 400 %' or produtos.nome LIKE '%HD 500%' or produtos.nome LIKE '%HD 640%' or produtos.nome LIKE '%HD 750%' or produtos.nome LIKE '%HD 80%' or produtos.nome LIKE '%HD EXT %' or produtos.nome LIKE '%HD EXTERNO%' or produtos.nome LIKE '%HD IDE%' or produtos.nome LIKE '%HD NB%' or produtos.nome LIKE '%HD NTB%' or produtos.nome LIKE '%HD SATA%' or produtos.nome LIKE '%HD SCSI%' or produtos.nome LIKE '%HD SSD%' or produtos.nome LIKE '%HD USB%' or produtos.nome LIKE '%HD-NB%' or produtos.nome LIKE '%HD-NOTEBOOK%' or produtos.nome LIKE '%NTB HD%') and lojas.publish=1 order by produtos.nome fiz um explain nas duas queries e dá o seguinte: *************************** 1. row *************************** id: 1 select_type: SIMPLE table: produtos type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 42080 Extra: Using where; Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: lojas type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: lojasnoparagua.produtos.lojas_id rows: 1 Extra: Using where alguém pode me dizer se essas queries estão usando o índice? no phpMyAdmin a cardinalidade: prod_nome2 INDEX 42080 prod_nome FULLTEXT 1 muito obrigado e desde já agaredeço
-
alguma sugestão, galerA? obrigado
-
Olá, Denis, agradeço suas respostas rápidas... VALE LEMBRAR QUE A query com o LOCATE retorna o resultado desejado: MUITO OBRIGADO! executei o comando acima com EXPLAIN e retornou: consulta SQL: explain SELECT straight_join SQL_CACHE produtos.nome, produtos.preço, lojas.nome AS nomeLoja, site, produtos.id FROM produtos force INDEX ( prod_nome ) INNER JOIN lojas ON lojas.id = produtos.lojas_id WHERE ( ( MATCH ( produtos.nome ) AGAINST ( '+notebook' IN BOOLEAN MODE ) ) OR LOCATE( 'nb', produtos.nome ) <>0 ) AND lojas.publish =1 order by produtos.nome asc \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: produtos type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 36535 Extra: Using where; Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: lojas type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: lojasnoparagua.produtos.lojas_id rows: 1 Extra: Using where 2 rows in set (0.00 sec) ainda me parce que não usou o índice INDEX prod_nome nem o FULLTEXT para sua pergunta, não.. não há índice para lojas.publish , vale lembrar que esse valor é sempre 0 ou 1 muito obrigado
-
deixei os dois indices rodei a primeira query e tive o seguinte resultado: consulta SQL: EXPLAIN SELECT SQL_CACHE produtos.nome, produtos.preço, lojas.nome AS nomeLoja, site, produtos.id FROM produtos INNER JOIN lojas ON lojas.id = produtos.lojas_id WHERE (MATCH (produtos.nome) AGAINST ( '+notebook' IN BOOLEAN MODE)) OR LOCATE('nb', produtos.nome) AND lojas.publish =1; Registros: 2 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE produtos ALL NULL NULL NULL NULL 36453 Using where 1 SIMPLE lojas eq_ref PRIMARY PRIMARY 4 lojasnoparagua.produtos.lojas_id 1 Using where está usando o índice? pra mim parece que não.. testei a outra query e fica: consulta SQL: EXPLAIN SELECT SQL_CACHE produtos.nome, produtos.preço, lojas.nome AS nomeLoja, site, produtos.id FROM produtos USE INDEX (prod_nome) INNER JOIN lojas ON lojas.id = produtos.lojas_id WHERE (MATCH (produtos.nome) AGAINST ('+notebook' IN BOOLEAN MODE)) OR LOCATE('nb', produtos.nome) AND lojas.publish =1; Registros: 2 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE produtos ALL NULL NULL NULL NULL 36453 Using where 1 SIMPLE lojas eq_ref PRIMARY PRIMARY 4 lojasnoparagua.produtos.lojas_id 1 Using where não sei se esta usando index aqui.. obrigado e espero resposta
-
olá, obrigado pela resposta removo o indice fulltext do nome antes? obrigado
-
olá, obrigado pela resposta mudei o parenteses de lugar pra usar certo o concat SELECT SQL_CACHE produtos.nome, produtos.preço, lojas.nome AS nomeLoja, site, produtos.id FROM produtos INNER JOIN lojas ON lojas.id = produtos.lojas_id WHERE MATCH (produtos.nome) AGAINST (CONCAT( '+notebook', " ", '+nb ' ) IN BOOLEAN MODE) AND lojas.publish =1 o resultado é o mesmo que a query que te passei antes mas o problema é que ele não está pegando os registro com 'nb ' só os 'notebook' lendo em http://dev.mysql.com/doc/refman/4.1/pt/ful...ine-tuning.html meu servidor ta setado 'ft_min_word_len=3' minimo 3 carecteres.. estranho que tem espaço ali após o 'nb' => 'nb ' não tenho acesso as configurações do servidor pra mudar o valor de ft_min_word para 2 e meu host me disse que não poderia! alguma sugestão? muito obrigado
-
Olá, SELECT sql_cache produtos.nome,produtos.preço,lojas.nome as nomeLoja, site, produtos.id FROM produtos inner join lojas on lojas.id = produtos.lojas_id WHERE ( MATCH (produtos.nome) AGAINST ('+notebook' IN BOOLEAN MODE) or MATCH (produtos.nome) AGAINST ('+nb ' IN BOOLEAN MODE)) and lojas.publish=1 só retorna os registro com notebook não retorna os 'nb ' alguém sabe o que pode ser? obrigado
-
olá, obrigado pela resposta.. dei uma estudada e cheguei a essa 'conversão' a query: SELECT sql_cache produtos.nome,produtos.precco,lojas.nome as nomeLoja, site, produtos.id FROM produtos inner join lojas on lojas.id = produtos.lojas_id where ( produtos.nome LIKE '%processador%' or produtos.nome LIKE '%cpu%') and produtos.nome LIKE '%intel%' and lojas.publish=1 para: SELECT produtos.nome, produtos.precco, lojas.nome AS nomeLoja, site, produtos.id FROM produtos INNER JOIN lojas ON lojas.id = produtos.lojas_id WHERE (MATCH (produtos.nome) AGAINST ('+processador' IN BOOLEAN MODE) or MATCH (produtos.nome) AGAINST ('+cpu' IN BOOLEAN MODE) ) and MATCH (produtos.nome) AGAINST ('+intel' IN BOOLEAN MODE) AND lojas.publish =1 ta certo isso ou tem alguma maneira para melhorar? obrigado
-
valeu, Denis.. mas como ficaria a query sem os LIKE? obrigadão
-
olá, modifiquei todas as tabelas para MyISAM pode me sugerir quais campos para indice FULLTEXT? obrigado
-
ola, os indices são: Nome chave Tipo Campo PRIMARY PRIMARY 37826 id lojas_id INDEX 37 lojas_id codigo INDEX 37826 codigo tipo da tabela produtos: InnoDB não posso retirar o LIKE, pois ai acabaria com a minha pesquisa.. para trocar para MyISAM teria que trocar as tabelas pai para MyISAM, certo? não acabaria com minhas chaves extrangeiras? quais campos posso criar indice FULLTEXT? nome? obrigado
-
Olá, tenho a seguinte tabela: CREATE TABLE IF NOT EXISTS `produtos` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `lojas_id` int(10) unsigned NOT NULL DEFAULT '0', `nome` varchar(60) DEFAULT NULL, `codigo` varchar(15) DEFAULT NULL, `preço` varchar(10) DEFAULT NULL, `descc` text, `foto` varchar(200) DEFAULT NULL, `lastUpdate` varchar(22) NOT NULL, PRIMARY KEY (`id`), KEY `lojas_id` (`lojas_id`), KEY `codigo` (`codigo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=62123; -- -- Restrições para a tabela `produtos` -- ALTER TABLE `produtos` ADD CONSTRAINT `produtos_ibfk_1` FOREIGN KEY (`lojas_id`) REFERENCES `lojas` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION; tenho essa query: SELECT SQL_CACHE produtos.nome, produtos.preço, lojas.nome AS nomeLoja, site, produtos.id FROM produtos INNER JOIN lojas ON lojas.id = produtos.lojas_id WHERE ( produtos.nome LIKE '%Estabilizador%' OR produtos.nome LIKE '%ESTAB.%' OR produtos.nome LIKE '%ESTAB%' ) AND produtos.nome LIKE '%1000%' AND produtos.nome LIKE '%110%' AND lojas.publish =1 ORDER BY produtos.nome ASC LIMIT 0 , 100 tenho 35 mil registro... e tem horas que a query(essa query em cima depende do que o usuário digita) demora uns 10 segundos pra retornar deixando meu server/site off obrigado e espero resposta
-
oLÁ, tenho a seguinte situação: mysql> show columns from categorias; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | nome | varchar(40) | YES | | NULL | | +-------+------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> show index from categorias; +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | categorias | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 1 row in set (0.00 sec) mysql> show columns from lojas;; +---------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | categorias_id | int(10) unsigned | NO | MUL | 0 | | | nome | varchar(60) | YES | | NULL | | | site | varchar(60) | YES | | NULL | | | logo | varchar(50) | YES | | NULL | | | lista | varchar(100) | YES | | NULL | | +---------------+------------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec) mysql> show index from lojas;; +-------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+ | lojas | 0 | PRIMARY | 1 | id | A | 16 | NULL | NULL | | BTREE | | | lojas | 1 | categorias_id | 1 | categorias_id | A | 8 | NULL | NULL | | BTREE | | +-------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+ 2 rows in set (0.01 sec) mysql> show columns from produtos; +----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | lojas_id | int(10) unsigned | NO | MUL | 0 | | | nome | varchar(60) | YES | | NULL | | | codigo | varchar(15) | YES | | NULL | | | preço | varchar(10) | YES | | NULL | | | descc | text | YES | | NULL | | | foto | varchar(200) | YES | | NULL | | +----------+------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) mysql> show index from produtos; +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | produtos | 0 | PRIMARY | 1 | id | A | 26840 | NULL | NULL | | BTREE | | | produtos | 1 | lojas_id | 1 | lojas_id | A | 18 | NULL | NULL | | BTREE | | +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 2 rows in set (0.00 sec) mysql> EXPLAIN SELECT sql_cache produtos.nome,produtos.preço,lojas.nome as nomeLoja, site, produtos.id FROM produtos inner join lojas on lojas.id = produtos.lojas_id where ( produtos.nome LIKE '%processador%' or produtos.nome LIKE '%cpu%' or produtos.nome LIKE '%PROC %' or produtos.nome LIKE '%PROC. %' or produtos.nome LIKE '%PROCESADOR %') ORDER BY produtos.nome asc limit 0,30; +----+-------------+----------+--------+---------------+---------+---------+------------------------------------+-------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+--------+---------------+---------+---------+------------------------------------+-------+-----------------------------+ | 1 | SIMPLE | produtos | ALL | lojas_id | NULL | NULL | NULL | 27560 | Using where; Using filesort | | 1 | SIMPLE | lojas | eq_ref | PRIMARY | PRIMARY | 4 | lojasnoparaguai1.produtos.lojas_id | 1 | | +----+-------------+----------+--------+---------------+---------+---------+------------------------------------+-------+-----------------------------+ 2 rows in set (0.00 sec) a TAbela produtos tem 27mil registro.. existe alguma maneira de optimizar essa consulta ou essas tabelas? desde já agradeço.. muito obrigado