Вопрос: Как я могу выполнить поиск по пяти цветам с помощью этого проекта базы данных? Если это невозможно, есть ли лучшее решение?Дизайн базы данных для поиска нескольких цветов
Это цветной поиск, который я создал, и он отлично подходит для одного цвета, но я пытаюсь разрешить кому-то искать до 1-5 цветов, и в идеале он найдет носители, у которых есть все или некоторые этих цветов.
Запрос начинается с шестнадцатеричного кода, затем преобразуется в RGB. В настоящее время я храню до 5 цветов (в будущем может храниться до 8).
CREATE TABLE `media_has_colors_unique_index` (
`media_id` int(9) unsigned NOT NULL,
`red` int(3) unsigned NOT NULL,
`green` int(3) unsigned NOT NULL,
`blue` int(3) unsigned NOT NULL,
`hex` varchar(6) NOT NULL DEFAULT '',
`percentage` double unsigned NOT NULL,
`sequence` int(11) unsigned NOT NULL,
PRIMARY KEY (`media_id`,`red`,`green`,`blue`),
KEY `index_on_hex` (`hex`),
KEY `index_on_percentage` (`percentage`),
KEY `index_on_timestamp` (`sequence`),
KEY `index_on_media_id` (`media_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Вот пример запроса, я бегу на временной базы данных с около миллиона записей:
SELECT media_id, hex, percentage
FROM media_has_colors_unique_index
WHERE
((red BETWEEN 41 AND 50) AND (green BETWEEN 166 AND 203) AND (blue BETWEEN 216 AND 264))
AND
((red BETWEEN 137 AND 168) AND (green BETWEEN 215 AND 262) AND (blue BETWEEN 223 AND 272))
GROUP BY media_id
HAVING percentage > 0.3
LIMIT 100;
Часть запроса, который читает BETWEEN 41 AND 50
динамически создаются для каждого цветового канала в PHP путем вычисления порога соответствия на основе процента: MIN = ceil($rgb[0] * .9)
и MAX = ceil($rgb[0] * 1.1)
. По существу 10% в любом направлении - это позволяет использовать ряд цветовых совпадений, которые по-прежнему визуально похожи на исходный цветной поиск.
Вопрос: Как я могу искать до пяти цветов с помощью этого дизайна базы данных? Если это невозможно, есть ли лучшее решение?
Вы не знаете, что хотите. Что означает «поиск по нескольким цветам»? Или «совпадение с несколькими цветами»? Пожалуйста, прочитайте о MVCE. Пример ввода, запроса и желаемого вывода полезен. В вашем примере запрос возвращает носитель с цветом, который находится в первом трехмерном диапазоне И, который является вторым трехмерным диапазоном. Не носители с цветом в первом диапазоне и носители с цветом во втором диапазоне. Последние представляют собой носители с цветом, который находится в первом диапазоне ИЛИ, который находится во втором диапазоне. Если вы хотите, чтобы эти носители использовали OR вместо AND. (Но неясно, чего вы хотите.) – philipxy
@philipxy hmm Я не уверен, как я могу сделать свой вопрос более ясным ... но он по-прежнему «Как я могу выполнить поиск по нескольким цветам с помощью этого проекта базы данных, или если не это, какой дизайн базы данных я мог бы использовать? " Для меня очевидно, что при поиске вам нужны совпадения, поэтому «поиск по» или «совпадение» действительно один в одном. Но по существу я пытаюсь разрешить кому-то искать до 1-5 цветов, и в идеале он найдет носители, у которых есть все или некоторые из этих цветов. – stwhite
Наконец-то вы сказали: «Найдите носители, у которых есть все или некоторые из этих цветов». (Хотя «все» избыточно.) «Поиск» и «совпадение» говорят, что вы ищете что-то, но они не выражают, что такое * критерий *. Например, сравните с «найти носитель (который имеет * все * эти цвета)». Недостаточно написать * некоторые * вещи * согласованные * с вашим пониманием, вы должны написать * спецификацию * или * контракт *, которая вызывает понимание в сознании другого человека. (И получается, что «цвет» означает «трехмерный цветовой диапазон».) – philipxy