Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mySQL MATCH w wielu tabelach

  • W MySQL nie można definiować indeksów pełnotekstowych (ani żadnego rodzaju indeksów) w wielu tabelach. Każda definicja indeksu odwołuje się dokładnie do jednej tabeli. Wszystkie kolumny w danym indeksie pełnotekstowym muszą pochodzić z tej samej tabeli.

  • Kolumny nazwane jako argumenty funkcji MATCH() funkcja musi być częścią pojedynczego indeksu pełnotekstowego. Nie możesz użyć pojedynczego wywołania MATCH() aby przeszukać wszystkie kolumny, które są częścią wszystkich indeksów pełnotekstowych w Twojej bazie danych.

  • Indeksy pełnotekstowe tylko indeksują kolumny zdefiniowane za pomocą CHAR , VARCHAR i TEXT typy danych.

  • Możesz zdefiniować indeks pełnotekstowy w każdej tabeli.

Przykład:

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

Następnie możesz napisać zapytanie, które używa każdego odpowiedniego indeksu pełnotekstowego:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego MySQL używa niewłaściwego indeksu?

  2. Jak korzystać z rdzenia AspNet.Identity w bazie danych My Sql

  3. Aktualizowanie kolumny tak, aby zawierała pozycję wiersza

  4. Jak uzyskać procent sumy, gdy zapytanie ma GROUP BY?

  5. Funkcja MySQL ROUND() — zaokrąglanie liczby do podanej liczby miejsc dziesiętnych