好的,所以我想从下面的表格设置中了解如何确定相机的最佳选择。这不是一个真实的场景我只想弄清楚最好的方法或某种方式来做这件事。
因此摄像机表具有唯一的条目id(INT),名称(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,'摄像机3',1 ,10,99)和CAMERA(4,'Camera 4',1,10,6)然后最后一列确定结果。
基本上,任何三列中任何一个具有最佳价值的相机都会自动成为可供选择的顶级相机列表的候选者。但是,如果多个摄像机对同一列具有最佳值,那么我们需要通过查看其他列的值来确定哪个是最好的。
因此,使用查询上方的数据库状态将返回摄像机(1,'摄像机1',5,100,1)和(4,'摄像机4',1,10,6),因为摄像机ID 1具有最高的reviewRank和最低的failRate和摄像机ID 4和摄像机ID 3并列最低价格,但摄像机ID 4的failRate低于摄像机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);
然而,这显然是错误的,因为它没有涵盖所有可能的排列。 在做了相当多的寻找方法之后,我仍然不知道该怎么做。
答案 0 :(得分: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