我需要在第一个查询中获得表格的上半部分,在下一个查询中我需要下半部分。
我尝试过这个,但它无法正常工作
SELECT * FROM t_domains WHERE type_domain='radio' ORDER BY
date_created DESC LIMIT 0, (COUNT(*) / 2)
我需要它作为两个查询我的功能才能工作。
有人有任何指示或提示吗?
答案 0 :(得分:4)
我建议做2个查询:
select count(*) from t_domains
获取总计数,然后使用限制和偏移量获取所需数据:
select * from t_domains limit count/2
表示顶部和
select * from t_domains offset count/2
为下半部......
这种方法还为您提供了一种在另一种情况下限制查询的方法:如果表包含100万条记录,该怎么办?
答案 1 :(得分:1)
上半场
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&lt; = 此“&lt;”在这个“&gt;”
答案 2 :(得分:0)
这总是有效的。
存储点数
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}
答案 3 :(得分:0)
就像MySQL的官方文档中的explained一样,LIMIT
的两个参数必须都为常量,除了已准备好的语句和存储的程序。简单地存储计数并随后在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()
,它认为值相等的行具有相同的“排名”。