2

好的,所以我试图从下面的表格设置中获得一些关于如何确定相机的最佳选择的想法。这不是一个真实的场景,我只是想找出最好的方法或某种方法来做到这一点。

因此,camera table 具有唯一的条目 id(INT)、name(VARCHAR)、reviewRank(INT)、price(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,'Camera 3',1 ,10,99) 和 CAMERA(4,'Camera 4',1,10,6) 然后最后一列确定结果。

基本上,在三列中的任何一个中具有最佳价值的任何相机都会自动成为顶级相机列表的候选者以供选择。但是,如果多个相机在同一列中具有最佳值,那么我们需要通过查看其他列的值来确定哪一个是最好的。

因此,使用查询上方的数据库状态将返回摄像机 (1,'Camera 1',5,100,1) 和 (4,'Camera 4',1,10,6),因为摄像机 id 1 具有最高的 reviewRank 和最低的 failRate 和相机 ID 4 和相机 ID 3 并列价格最低,但相机 ID 4 的故障率低于相机 ID 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);

然而,这显然是错误的,因为它没有涵盖所有可能的排列。在做了相当多的寻找解决这个问题的方法之后,我仍然不知道如何解决这个问题。

4

1 回答 1

0

我相信该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
于 2012-03-19T21:41:41.350 回答