显示一个列中的前三个最大值,包括重复的值。

4
我正在尝试在页面上显示最高的三个分数,我使用以下代码。
Select * from myTable Marks Desc Limit 3. 

在没有重复记录的情况下,它可以正常工作。

我的表:

Name     Mark
------------
S1       90
S2       55
S3       60
S4       90
S5       55
S6       60
S7       88   
S8       45  
S9       88

就像上面的表格,我想要显示包含重复记录的3条记录。

因此,我的最终输出应该如下:

Name     Marks
----------------
S1       90
S4       90
S7       88 
S9       88
S3       60
S6       60

Kindly please help me.


在你的代码中使用distinct,避免重复数据。 - Php developer
2个回答

4
首先选择唯一的3个最佳分数,然后找到所有具有这些分数之一的记录:
SELECT name, mark 
FROM mytable AS t1 
    INNER JOIN 
        (SELECT DISTINCT(mark) AS best_marks FROM mytable ORDER BY mark DESC LIMIT 3) AS t2
    ON t1.mark = t2.best_marks
ORDER BY mark DESC, name ASC;

0

您可以尝试创建一个临时表来存储前三条记录,并通过连接该表来显示结果。
除此之外,在同一查询中获取这个结果会非常复杂,性能影响也会很大。

如果您仍然坚持,可以尝试以下方法:

SELECT * FROM myTable 
WHERE mark IN (SELECT MAX(mark) FROM myTable) 
OR mark IN (SELECT MAX(mark) FROM myTable WHERE mark < (SELECT MAX(mark) FROM myTable)) 
OR mark IN (SELECT MAX(mark) FROM myTable WHERE mark < (SELECT MAX(mark) FROM myTable WHERE mark < (SELECT MAX(mark) FROM myTable)));

这只适用于前三个。如果你想要更多,那么你需要增加where子句中的或条件。但是,这会影响性能。


朋友,我不想失礼,但那个查询有点丑陋 :) 没必要让自己头疼,真的。看看我的答案,其实很简单。干杯。 - Eggplant
你说得对。我曾认为,在使用联接的内部查询中,limit 无法像 union 那样使用。谢谢你澄清了这个困惑……我尝试了你的方法,它起作用了……太好了!! - Akhil
不客气 :) 从性能方面来看也不错:子查询只执行一次,然后与表连接。如果 mark 被索引了,那么即使有大量数据,它也应该非常快。 - Eggplant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接