Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mySQL MATCH em várias tabelas


  • Você não pode definir índices de texto completo (ou qualquer tipo de índice) em várias tabelas no MySQL. Cada definição de índice faz referência a exatamente uma tabela. Todas as colunas em um determinado índice de texto completo devem ser da mesma tabela.

  • As colunas nomeadas como argumentos para o MATCH() A função deve fazer parte de um único índice de texto completo. Você não pode usar uma única chamada para MATCH() para pesquisar todas as colunas que fazem parte de todos os índices de texto completo em seu banco de dados.

  • Índices de texto completo apenas colunas de índice definidas com CHAR , VARCHAR e TEXT tipos de dados.

  • Você pode definir um índice de texto completo em cada tabela.

Exemplo:
CREATE TABLE categories (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  FULLTEXT INDEX ftcat (name)
);

CREATE TABLE host_types (
  id SERIAL PRIMARY KEY,
  category_id BIGINT UNSIGNED,
  name VARCHAR(100),
  FULLTEXT INDEX ftht (name)
);

CREATE TABLE hosts (
  id SERIAL PRIMARY KEY,
  host_id BIGINT UNSIGNED,
  category_id BIGINT UNSIGNED,
  name VARCHAR(100),
  FULLTEXT INDEX fthost (name)
);

CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  keywords VARCHAR(100),
  uid VARCHAR(100),
  description VARCHAR(100),
  quantity INTEGER,
  price NUMERIC(9,2),
  host_id BIGINT UNSIGNED,
  FULLTEXT INDEX ftprod (name, keywords, description, uid)
);

E então você pode escrever uma consulta que usa cada índice de texto completo respectivo:
SELECT ...
  MATCH(categories.name) AGAINST('search term') as cscore, 
  MATCH(host_types.name) AGAINST('search term') as htscore,
  MATCH(hosts.name) AGAINST('search term') as hscore,
  MATCH(products.name, products.keywords, products.description, products.uid)
    AGAINST('search term') as score
FROM products
LEFT JOIN hosts ON products.host_id = hosts.id
LEFT JOIN host_types ON hosts.host_id = host_types.id
LEFT JOIN categories ON host_types.category_id = categories.id
WHERE
  MATCH(categories.name) AGAINST('search term') OR
  MATCH(host_types.name) AGAINST('search term') OR
  MATCH(hosts.name) AGAINST('search term') OR
  MATCH(products.name, products.keywords, products.description, products.uid)
    AGAINST('search term')
ORDER BY score DESC;