如何获取MySql中每列的前N个值

时间:2009-12-16 11:26:33

标签: mysql

我有一个包含50列和1000行的表。我想输出每列的前5个记录。我得到1条记录:

SELECT MAX(column1), MAX(column2), MAX(column3) FROM table

这会获得每列的最高值但是如何获得第二个“最大”值 n 次?

4 个答案:

答案 0 :(得分:3)

这不是您想要在单个查询中执行的操作。打破它,每列一个查询。在正确的情况下(也就是正确的索引和正确的列类型),MySQL实际上可以通过短路优化这些查询,这样它就不必扫描整个表,它只是拉出前5个值并完成。

SELECT column1 FROM table ORDER BY column1 DESC LIMIT 5
SELECT column2 FROM table ORDER BY column2 DESC LIMIT 5
etc

如果你试图将它们全部放到一个巨大的,kludgy查询中,你只能设法说服优化器放弃并重新扫描整个表50次然后使用50个临时表,可能还有一些文件排序好测量。因此,除非你的表中有大约10行(显然没有),50个单独的查询总是会更快。

答案 1 :(得分:0)

可能有更好的方法,但你可以嵌套SELECT语句。

类似的东西:

SELECT (SELECT column1 FROM table ORDER BY column1 LIMIT 5) a,
       (SELECT column2 FROM table ORDER BY column2 LIMIT 5) b,
       (SELECT column3 FROM table ORDER BY column3 LIMIT 5) c

如果您使用的是Oracle,请添加“FROM dual”。

答案 2 :(得分:0)

假设每列中最大的五个值可能出现在不同的行上,则必须在50个查询中执行此操作。

说明:SQL查询的select-list中的表达式必须引用同一行。因此,您可以通过这种方式获得column1的前五个值:

SELECT column1, column2, column3 FROM table ORDER BY column1 DESC LIMIT 5;

但是column2column3的值当然不一定是这些列中的最大值,它们可能是在具有最大值的同一行上的任何值。 column1

从表的不同行获取值到单个选择列表的唯一方法是执行自联接

SET @i1 = 0, @i2 = 0, @i3 = 0, @i4 = 0, @i5 = 0;
SELECT * 
FROM (SELECT @i1:=@i1+1 AS i, column1 FROM table ORDER BY column1 DESC LIMIT 5) t1 ON (t1.i = t5.i)
JOIN (SELECT @i2:=@i2+1 AS i, column2 FROM table ORDER BY column2 DESC LIMIT 5) t2 ON (t1.i = t5.i)
JOIN (SELECT @i3:=@i3+1 AS i, column3 FROM table ORDER BY column3 DESC LIMIT 5) t3 ON (t1.i = t5.i)
JOIN (SELECT @i4:=@i4+1 AS i, column4 FROM table ORDER BY column4 DESC LIMIT 5) t4 ON (t1.i = t5.i)
JOIN (SELECT @i5:=@i5+1 AS i, column5 FROM table ORDER BY column5 DESC LIMIT 5) t5 ON (t1.i = t5.i);

但这对50列来说不实用或有效。

我也不得不怀疑你的数据库设计。如果您需要50列中的前五位,那么它们是否都存储了相同类型的信息?您可以练习多列属性反模式。如果是这样,您应该将所有50列放入子表中的单个列中。

答案 3 :(得分:-1)

SELECT MAX(column1), MAX(column2), MAX(column3) FROM table LIMIT n

其中n =次数

但是,您只能对整个查询使用LIMIT,因此您需要单独提取第二列。