假设我有一张帖子。但我想今天查询所有帖子。但如果今天的帖子不到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.
答案 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