我可以在SQL语句中执行此操作吗?

时间:2011-09-13 11:08:51

标签: mysql sql

假设我有一张帖子。但我想今天查询所有帖子。但如果今天的帖子不到10个帖子,我会回到昨天的帖子来查询。如果是超过10个帖子,则无需查询昨天的帖子....如果SQL语句不能这样做。这是通过手动调用帖子来实现的吗?谢谢。

***数据库是MySQL

让我在一个典型的例子中澄清这个问题:

  

如果今天有5个帖子....仅限。昨天有10个帖子。

     

返回:今天有5个帖子,昨天有5个帖子

If today have 12 posts....ONLY.
And yesterday have 10 posts. 

return : 12 today posts.
  

如果今天有10个帖子....仅限。昨天有10个帖子。

     

返回:今天10个帖子。

If today have 2 posts....ONLY. yesterday have 5 posts, and the day before yesterday 5posts. 

return : 2 today posts, 5 yesterday posts, 3 the day before yesterday posts.

3 个答案:

答案 0 :(得分:7)

你可以尝试

select count(*) from post_table
where date = todays_date

如果结果是> 10然后

select * from post_table
where date = today's date

否则

select * from post_table  
order by date desc
limit 10

答案 1 :(得分:2)

Jan S解决方案的一个微小开发(将两个条件SELECT组合成一个带参数化LIMIT的一个):

SELECT @count := COUNT(*)
FROM post_table
WHERE date = today;

IF @count < 10 SET @count = 10;

SELECT *
FROM post_table
ORDER BY date DESC
LIMIT @count;

<强>更新

如文件中所述:

  

LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量,但有以下例外:

     
      
  • 在准备好的陈述中,可以使用LIMIT占位符标记指定?个参数。

  •   
  • 在存储的程序中,可以使用整数值例程参数或局部变量指定LIMIT个参数。

  •   

这意味着,您只能在存储过程中使用上述代码,而不能在客户端应用程序中发出的普通查询中使用。

答案 2 :(得分:2)

只是另一个想法,稍微短一些:

set @i = 0;
select *, @i := @i + 1
from post_table
where @i < 10 or date = today
order by date desc;

不确定它是否非常有效。

更新:它很快! 我测试了这样的样本:

create table a(i int primary key, d date not null, index idx(d)) 
set @i = 0;

insert into a(i, d)
select @i := @i + 1, adddate(curdate(), interval -(@i % 1000) day) 
from <100 records> a, <100 records> b, <100 records> c