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.
我想知道是否可以在 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.