Хорошо, поэтому я пытаюсь получить некоторые идеи о том, как определить, какие варианты выбора камеры у меня есть из приведенной ниже таблицы. Это не реальный сценарий, я просто пытаюсь найти лучший способ или каким-то образом сделать это.Запрос MySQL для выбора выбора верхней камеры на основе значений нескольких столбцов
Таким образом, в таблице камер есть записи id (INT), которые уникальны, имя (VARCHAR), reviewRank (INT), цена (INT) и failRate (INT). Вот пример настройки TABLE и вставки кода:
CREATE TABLE CAMERA(
id INTEGER,
name VARCHAR(30),
reviewRank INT,
price INT,
failRate INT,
PRIMARY KEY(id))ENGINE=INNODB;
INSERT INTO CAMERA VALUES(1,'Camera 1',5,100,1);
INSERT INTO CAMERA VALUES(2,'Camera 2',4,300,7);
INSERT INTO CAMERA VALUES(3,'Camera 3',1,10,99);
INSERT INTO CAMERA VALUES(4,'Camera 4',1,10,6);
Критерии является то, что выше reviewRank лучше, более низкая цена лучше, а нижняя failRate лучше. И если несколько камер используют лучшее значение для одного из столбцов, тогда мы выбираем тот, который имеет лучшие значения в двух других столбцах, или если несколько камер имеют одинаковые значения в нескольких столбцах, таких как CAMERA (3, «Камера 3», 1 , 10,99) и CAMERA (4, «Камера 4», 1,10,6), то последний столбец определяет результат.
В принципе любая камера с лучшим значением в любом из трех столбцов автоматически становится кандидатом на список лучших камер на выбор. Но если несколько камер имеют наилучшее значение для одного и того же столбца, нам нужно определить, какой из них лучше, посмотрев на значения других столбцов.
Таким образом, использование состояния базы данных над запросом будет возвращать камеры (1, «Камера 1», 5, 100, 1) и (4, «Камера 4», 1,10,6), так как идентификатор камеры 1 имеет самый высокий обзорRank и самый низкий failRate и идентификатор камеры 4 и идентификатор камеры 3 для самой низкой цены, но идентификатор камеры 4 имеет более низкое значение failRate, чем идентификатор камеры 3.
Так что в основном я пытаюсь найти способ найти лучшие варианты где есть несколько сопоставлений столбцов с использованием MySQL, предпочтительно, используя один запрос, если это возможно.
Мои первые мысли были что-то вроде этого
SELECT DISTINCT C.*
FROM CAMERA C
WHERE C.reviewRank>=ALL(SELECT reviewRank FROM CAMERA)
OR C.price<=ALL(SELECT price FROM CAMERA)
OR C.failRate<=ALL(SELECT failRate FROM CAMERA);
Однако это, очевидно, неправильно, так как он не охватывает всех возможных перестановок. И после довольно многого поиска пути для этого я до сих пор не знаю, как это сделать.
Обе камеры (1, 'Камера 1', 5,100,1) и (4 'Камера 4', 1,10 , 6) необходимо вернуть, поскольку (1, «Камера 1», 5, 100,1) имеет лучший общий обзорный рейтинг, а также имеет лучший failRate, поэтому его следует рассматривать как лучший выбор. Камера (4, «Камера 4», 1,10,6) делится лучшими ценами с камерой (3, «Камера 3», 1,10,99), но имеет более высокий коэффициент возврата, поэтому камера (4, «Камера 4», 1,10,6) также должно быть возвращено – BobPotter
@BobPotter Ах, теперь я понимаю лучше ... так что вам нужен один элемент из каждой из трех категорий, но если один и тот же элемент является лучшим для нескольких категорий, тогда он должен возвращаться только один раз. См. Мой обновленный запрос. –
Фрагмент кода, который вы опубликовали, действительно работает корректно с данным состоянием. Я думаю, что вы правильно поняли проблему. Чтобы уточнить, результат не обязательно должен быть одним элементом из каждой из трех категорий. Запрос мог возвращать только один кортеж в случае, когда у этого кортежа был лучший ранг, лучшая цена и лучший failRate. Так что да, в основном то, что вы заявили, я думаю. – BobPotter