Mysql
 sql >> Base de données >  >> RDS >> Mysql

mySQL MATCH sur plusieurs tables

  • Vous ne pouvez pas définir d'index de texte intégral (ni aucun type d'index) sur plusieurs tables dans MySQL. Chaque définition d'index référence exactement une table. Toutes les colonnes d'un index de texte intégral donné doivent provenir de la même table.

  • Les colonnes nommées comme arguments du MATCH() La fonction doit faire partie d'un seul index de texte intégral. Vous ne pouvez pas utiliser un seul appel à MATCH() pour rechercher toutes les colonnes faisant partie de tous les index de texte intégral de votre base de données.

  • Les index de texte intégral indexent uniquement les colonnes définies avec CHAR , VARCHAR , et TEXT types de données.

  • Vous pouvez définir un index de texte intégral dans chaque table.

Exemple :

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)
);

Et ensuite, vous pouvez écrire une requête qui utilise chaque index de texte intégral respectif :

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;