2014-10-03 40 views
0
Database 1   Database 2 
||==============|| ||==============|| 
||user || value || ||user || value || 
||-----||-------|| ||-----||-------|| 
|| 1 || 50 || || 1 || 50 || 
|| 2 || 50 || || 2 || 50 || 
|| 3 || 50 || || 3 || 40 || 
|| 4 || 40 || || 4 || 40 || 
|| 5 || 40 || || 5 || 30 || 
|| 6 || 40 || || 6 || 20 || 
|| 7 || 40 || || 7 || 20 || 
|| 8 || 30 || || 8 || 10 || 
|| 9 || 30 || || 9 || 10 || 
||==============|| ||==============|| 

我需要搜索前5名最高值,而不是只有5个结果我需要那些7个50和40值的用户。如何获得超过极限5的多个相同的输出在SQL中的TOP 5值5

我不能忽视他们其他顶级用户。 如果可能在SQL中完成,那将会很棒。如果不是的话,PHP的帮助就可以做到。

 Result 1    Result 1 
||==============|| ||==============|| 
||user || value || ||user || value || 
||-----||-------|| ||-----||-------|| 
|| 1 || 50 || || 1 || 50 || 
|| 2 || 50 || || 2 || 50 || 
|| 3 || 50 || || 3 || 50 || 
|| 4 || 40 || || 4 || 50 || 
|| 5 || 40 || || 5 || 50 || 
|| 6 || 40 || ||==============|| 
|| 7 || 40 || 
||==============||  
+1

我很困惑。你想要前5还是前7?从这个假设的查询中显示您的预期结果。 – wavemode 2014-10-03 01:04:56

+0

@wavemode他想要的是前5名加上领带。 – Barmar 2014-10-03 01:17:24

+0

呵呵,原来只显示数据库1. – wavemode 2014-10-03 01:18:41

回答

1
SELECT user, value 
FROM Database 
WHERE value in (
    SELECT value 
    FROM Database 
    ORDER BY value DESC 
    LIMIT 5) 
) 
ORDER BY value DESC, user 

另一种方法是:

SELECT user, value 
FROM Database 
WHERE value >= (SELECT MIN(value) 
       FROM (SELECT value 
         FROM Database 
         ORDER BY value DESC 
         LIMIT 5) AS x 
       ) 
ORDER BY value DESC, user 
+0

谢谢..这一个很好。 – user2045458 2014-10-03 01:28:58

1

一般来说,对于一个给定的表,你可以这样做:

SELECT t.* 
FROM table t CROSS JOIN 
    (SELECT t.* 
     FROM table t 
     ORDER BY value DESC 
     LIMIT 1 OFFSET 4 
    ) t5 
WHERE t.value >= t5.value; 

子查询选择第五行(OFFSET开始计数在0而不是1)。 where子句只是选择大于该值的任何东西。

如果你想在两个表上运行这个组合,那么你会想要使用union all

+0

+1我在回答中没有想到OFFSET选项。 – Barmar 2014-10-03 01:26:24