MySQL запрос, чтобы выбрать лучший выбор камеры на основе нескольких значений столбца - PullRequest
2 голосов
/ 20 марта 2012

Хорошо, поэтому я пытаюсь получить некоторые идеи о том, как определиться с выбором наиболее подходящей камеры из таблицы ниже. Это не реальный сценарий, я просто пытаюсь найти лучший способ или какой-то способ сделать это.

Таким образом, таблица камеры имеет уникальный идентификатор записей (INT), имя (VARCHAR), reviewRank (INT), цену (INT) и failRate (INT). Вот пример настройки ТАБЛИЦЫ и вставки кода:

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

Критерием является то, что чем выше обзорный рейтинг, тем лучше, чем ниже цена, тем лучше, и чем ниже рейтинг неудачи, тем лучше. И если несколько камер имеют лучшее значение для одного из столбцов, то мы выбираем ту, которая имеет лучшие значения в двух других столбцах, или если несколько камер имеют одинаковые значения в нескольких столбцах, таких как CAMERA (3, «Камера 3», 1 , 10,99) и CAMERA (4, «Камера 4», 1,10,6), тогда последний столбец определяет результат.

Практически любая камера с наилучшим значением в любом из трех столбцов автоматически становится кандидатом на выбор из списка лучших камер. Но если несколько камер имеют лучшее значение для одного и того же столбца, нам нужно определить, какие из них являются лучшими, взглянув на значения других столбцов.

Таким образом, при использовании состояния базы данных над запросом будут возвращены камеры (1, «Камера 1», 5,100,1) и (4, «Камера 4», 1,10,6), поскольку идентификатор камеры 1 имеет самый высокий обзор Наименьшее значение failRate, идентификатор камеры 4 и идентификатор камеры 3 имеют самую низкую цену, но идентификатор камеры 4 имеет более низкий показатель сбоя, чем идентификатор камеры 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 Ответ

0 голосов
/ 20 марта 2012

Я считаю, что предложение ORDER BY выполняет то, что вы ищете:

SELECT topC.Id, topC.Name, topC.ReviewRank, topC.Price, topC.FailRate
FROM Camera topC JOIN (
    (SELECT c.ReviewRank, c.Price, c.FailRate
    FROM Camera c
    ORDER BY 
        c.ReviewRank DESC,
        c.Price,
        c.FailRate
    LIMIT 1)
    UNION 
    (SELECT c.ReviewRank, c.Price, c.FailRate
    FROM Camera c
    ORDER BY 
        c.Price,
        c.FailRate,
        c.ReviewRank DESC
    LIMIT 1)
    UNION 
    (SELECT c.ReviewRank, c.Price, c.FailRate
    FROM Camera c
    ORDER BY 
        c.FailRate,
        c.Price,
        c.ReviewRank DESC
    LIMIT 1)
) values 
    ON values.ReviewRank = topC.ReviewRank
    AND values.Price = topC.price
    AND values.FailRate = topC.FailRate
...