我有一个包含50列和1000行的表。我想输出每列的前5个记录。我得到1条记录:
SELECT MAX(column1), MAX(column2), MAX(column3) FROM table
这会获得每列的最高值但是如何获得第二个“最大”值 n 次?
答案 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;
但是column2
和column3
的值当然不一定是这些列中的最大值,它们可能是在具有最大值的同一行上的任何值。 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,因此您需要单独提取第二列。