sql >> Databáze >  >> RDS >> Mysql

mySQL MATCH napříč více tabulkami

  • V MySQL nemůžete definovat fulltextové indexy (nebo jakýkoli druh indexu) pro více tabulek. Každá definice indexu odkazuje přesně na jednu tabulku. Všechny sloupce v daném fulltextovém indexu musí být ze stejné tabulky.

  • Sloupce pojmenované jako argumenty MATCH() funkce musí být součástí jediného fulltextového indexu. Nemůžete použít jediné volání funkce MATCH() k prohledání všech sloupců, které jsou součástí všech fulltextových indexů ve vaší databázi.

  • Fulltext indexuje pouze indexové sloupce definované pomocí CHAR , VARCHAR a TEXT datové typy.

  • V každé tabulce můžete definovat fulltextový index.

Příklad:

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

A pak můžete napsat dotaz, který používá každý příslušný fulltextový index:

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;


  1. org.postgresql.util.PSQLException:Velké objekty nelze použít v režimu automatického potvrzení

  2. Problémy s časovým pásmem Java MySQL Timestamp

  3. Jak svázat datatable s běhovým prostředím prohlížeče reportů

  4. Parametry GET zranitelné vůči SQL Injection - PHP