Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mySQL MATCH über mehrere Tabellen hinweg

  • Sie können in MySQL keine Volltextindizes (oder irgendeine Art von Index) über mehrere Tabellen hinweg definieren. Jede Indexdefinition referenziert genau eine Tabelle. Alle Spalten in einem bestimmten Volltextindex müssen aus derselben Tabelle stammen.

  • Die als Argumente für MATCH() benannten Spalten Funktion muss Teil eines einzelnen Volltextindexes sein. Sie können keinen einzelnen Aufruf von MATCH() verwenden um alle Spalten zu durchsuchen, die Teil aller Volltextindizes in Ihrer Datenbank sind.

  • Volltextindizes indizieren nur Spalten, die mit CHAR definiert sind , VARCHAR , und TEXT Datentypen.

  • Sie können in jeder Tabelle einen Volltextindex definieren.

Beispiel:

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

Und dann können Sie eine Abfrage schreiben, die den jeweiligen Volltextindex verwendet:

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;