Jump to content
Fórum Script Brasil
  • 0

Termos compostos


Renato Penna
 Share

Question

Boa tarde. Eu estou tentando fazer um SELECT no MySQL pra pegar ocorrências de termos compostos em alguns campos na tabela. A situação é a seguinte:

O cara vai fazer uma busca no site e tem que achar todas as palavras que ele usou na busca, mesmo que ele tenha escrito e as ocorrências que tem as palavras que ele buscou tem que vir antes.

Por exemplo: Existe um produto chamado cama suspensa para cães cooraloo. Então se ele buscar por exemplo por cama cooraloo ou por cooraloo cama tem que achar.

Então eu fiz assim:

SELECT ItemID, ItemName, ItemDescription FROM Items WHERE ItemName LIKE '%CAMA%' OR ItemName LIKE '%COORALOO%' OR ItemDescription LIKE '%CAMA%' OR ItemDescription LIKE '%COORALOO%' OR LongDescription LIKE '%CAMA%' OR LongDescription LIKE '%COORALOO%') AND Estoque = 'S'

Desse jeito, aparece o produto independente da forma como o usuário escreve. Minha dúvida agora é a seguinte: Como eu faço para que os produtos que tenham os nomes pesquisados pelo usuário apareçam primeiro ? Porque neste exemplo, existem outros produtos que começam com "cama" e que aparecem antes deste ítem.

Espero que tenha dado pra entender o que eu preciso. Agradeço desde já.

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

SELECT 
    ItemID, ItemName, ItemDescription,
    (ItemName LIKE '%CAMA%') +
    (ItemName LIKE '%COORALOO%') +
    (ItemDescription LIKE '%CAMA%') +
    (ItemDescription LIKE '%COORALOO%') +
    (LongDescription LIKE '%CAMA%') +
    (LongDescription LIKE '%COORALOO%')
    as total    
FROM Items 
WHERE 
    (
    ItemName LIKE '%CAMA%' 
    OR ItemName LIKE '%COORALOO%' 
    OR ItemDescription LIKE '%CAMA%' 
    OR ItemDescription LIKE '%COORALOO%' 
    OR LongDescription LIKE '%CAMA%' 
    OR LongDescription LIKE '%COORALOO%'
    ) 
    AND Estoque = 'S'
order by total desc

No mysql o resultado de uma expressão lógica é 1 se verdadeira ou zero se falsa. Então basta somar os resultados.

Edited by Kakao
Link to comment
Share on other sites

  • 0
Deu certo, obrigado!

Pesquise por indices FULLTEXT. São mais eficientes que o LIKE e não causam TABLE SCAN.

Exemplo:

Pesquisa full-text é realizada com a função MATCH().

mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> );
mysql> INSERT INTO articles VALUES
-> (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'),
-> (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'),
-> (NULL,'Optimizing MySQL','In this tutorial we will show ...'),
-> (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-> (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'),
-> (NULL,'MySQL Security', 'When configured properly, MySQL ...');

mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.4k
×
×
  • Create New...