MYSQL LIMIT 中的子查询

MYSQL subquery in a LIMIT

我想知道是否可以在 LIMIT 中使用子查询。

我想使用它的原因是 return 20%(1/5)的最佳购买客户。

例如(虽然这显然行不通):

SELECT id, revenue
FROM customers
ORDER BY revenue DESC
LIMIT (SELECT (COUNT(*) / 5) FROM customer) 

有没有办法在一个限制内进行子查询,或者以不同的方式return 20%?

使用 ANSI SQL 执行此操作的典型方法是使用 window 函数:

SELECT id, revenue
FROM (SELECT c.*,
             ROW_NUMBER() OVER (ORDER BY revenue DESC) as seqnum,
             COUNT(*) OVER () as cnt
      FROM customers
     ) c
WHERE seqnum <= cnt * 0.2
ORDER BY revenue DESC;

大多数数据库都支持这些函数。

MySQL 是少数不支持 window 函数的数据库之一。您可以使用变量:

SELECT id, revenue
FROM (SELECT c.*, (@rn := @rn + 1) as rn
      FROM customers c CROSS JOIN
           (SELECT @rn := 0) params
      ORDER BY c.revenue DESC
     ) c
WHERE rn <= @rn / 5;  -- The subquery runs first so @rn should have the total count here.