СООТВЕТСТВИЕ MySQL через несколько таблиц

Что касается использований в качестве примера неподписанный символ :

неподписанный символ часто используется в компьютерной графике, которая очень часто (хотя не всегда) присваивает единственный байт каждому компоненту цвета. Распространено видеть RGB (или RGBA) цвет, представленный как 24 (или 32) биты, каждый неподписанный символ . С тех пор неподписанный символ падение значений диапазона [0,255], значения обычно интерпретируются как:

  • 0 значений общее отсутствие данного компонента цвета.
  • 255 значений 100% данного цветного пигмента.

, Таким образом, Вы закончили бы с RGB, красным как (255,0,0)-> (100%-й красный, 0%-й зеленый, 0%-й синий цвет).

, Почему бы не использовать символ со знаком ? Арифметика и разрядное смещение становятся проблематичными. Как объяснено уже, диапазон символа со знаком по существу смещается на-128. Очень простой и наивный (главным образом неиспользованный) метод для преобразования RGB к шкале полутонов должен составить в среднем все три компонента цвета, но это сталкивается с проблемами, когда значения компонентов цвета отрицательны. Красный (255, 0, 0) средние числа к (85, 85, 85) при использовании неподписанный символ арифметика. Однако, если бы значения были символ со знаком s (127,-128,-128), мы закончили бы с (-99,-99,-99), который будет (29, 29, 29) в нашем неподписанный символ пространство, которое является неправильным.

10
задан Brian Tompsett - 汤莱恩 31 December 2016 в 18:49
поделиться

1 ответ

  • В MySQL нельзя определять полнотекстовые индексы (или любые другие) для нескольких таблиц. Каждое определение индекса ссылается только на одну таблицу. Все столбцы в данном полнотекстовом индексе должны быть из одной таблицы.

  • Столбцы, названные в качестве аргументов функции MATCH () , должны быть частью единственного полнотекстового индекса. Вы не можете использовать один вызов MATCH () для поиска всех столбцов, которые являются частью всех полнотекстовых индексов в вашей базе данных.

  • Полнотекстовые индексы только индексируют столбцы, определенные с помощью CHAR , VARCHAR и TEXT типы данных.

  • Вы можете определить полнотекстовый индекс в каждой таблице.

Пример:

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

А затем вы можете написать запрос, который использует каждый соответствующий полнотекстовый индекс:

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;
26
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: