我需要在第一个查询中获取表的上半部分,在下一个查询中我需要下半部分。
我尝试为顶部执行此操作,但它不起作用
SELECT * FROM t_domains WHERE type_domain='radio' ORDER BY
date_created DESC LIMIT 0, (COUNT(*) / 2)
我需要它作为我的函数工作的两个查询。
有人有任何指示或提示吗?
我需要在第一个查询中获取表的上半部分,在下一个查询中我需要下半部分。
我尝试为顶部执行此操作,但它不起作用
SELECT * FROM t_domains WHERE type_domain='radio' ORDER BY
date_created DESC LIMIT 0, (COUNT(*) / 2)
我需要它作为我的函数工作的两个查询。
有人有任何指示或提示吗?
我建议做2个查询:
select count(*) from t_domains
获取总数,然后使用limit和offset获取你想要的数据:
select * from t_domains limit count/2
对于顶部和
select * from t_domains offset count/2
对于下半部分......
这种方法还为您提供了一种在另一种情况下限制查询的方法:如果表包含 100 万条记录怎么办?
上半年
mysql-> SET @n := 0
mysql-> SELECT *,nnn FROM (
SELECT *, @n := @n + 1 AS nnn FROM t_domains ORDER BY date_created
) AS t
WHERE nnn <= ( SELECT COUNT(date_created) / 2 FROM t_domains ) AND type_domain = 'radio'
下半场,在此处更改 WHERE nnn <= this "<" on this ">"
正如MySQL 的官方文档中解释的那样,除了准备好的语句和存储的程序外,的两个LIMIT
参数都必须是CONSTANTS 。LIMIT
简单地存储计数并稍后在子句中使用它似乎并不容易。
从 8.0 版开始,MySQL 提供了一个ROW_NUMBER()
函数,它提供了一个比其他答案指出的更简单的解决方案。
set @count=(select count(*)/2 from t_domains);
select * from (
select *, ROW_NUMBER() over (order by date_created desc) as row_num
from t_domains
) as t
where row_num <= @count
;
您还可以检查RANK()
,它认为具有相同值的行具有相同的“排名”。
这总是有效的。
存储计数
SELECT COUNT(*) FROM t_domains WHERE type_domain='radio'
然后使用存储的计数。
SELECT * FROM t_domains WHERE type_domain='radio' ORDER BY
date_created DESC LIMIT 0, {$stored_count/2}