Mysql得到表的上半部分然后是表的下半部分

时间:2012-09-02 18:42:16

标签: mysql

我需要在第一个查询中获得表格的上半部分,在下一个查询中我需要下半部分。

我尝试过这个,但它无法正常工作

SELECT * FROM t_domains WHERE type_domain='radio' ORDER BY 
date_created DESC LIMIT 0, (COUNT(*) / 2)

我需要它作为两个查询我的功能才能工作。

有人有任何指示或提示吗?

4 个答案:

答案 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(),它认为值相等的行具有相同的“排名”。