sql >> Database >  >> RDS >> Mysql

mySQL MATCH over meerdere tabellen

  • U kunt in MySQL geen fulltext-indexen (of welke index dan ook) voor meerdere tabellen definiëren. Elke indexdefinitie verwijst naar precies één tabel. Alle kolommen in een gegeven fulltext index moeten uit dezelfde tabel komen.

  • De kolommen genoemd als argumenten voor de MATCH() functie moet deel uitmaken van een enkele fulltext-index. U kunt geen enkele aanroep gebruiken voor MATCH() om alle kolommen te doorzoeken die deel uitmaken van alle fulltext-indexen in uw database.

  • Fulltext indexeert alleen indexkolommen gedefinieerd met CHAR , VARCHAR , en TEXT datatypes.

  • U kunt in elke tabel een volledige tekstindex definiëren.

Voorbeeld:

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

En dan kun je een zoekopdracht schrijven die elke respectieve fulltext-index gebruikt:

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. Hoe kan ik ervoor zorgen dat mijn postgresql-database een hoofdletterongevoelige sortering gebruikt?

  2. Uitdagingsoplossingen voor generatorreeksen - deel 2

  3. Beste manier om live MySQL-database te archiveren

  4. orakel varchar naar nummer