Mysql 我可以在SQL语句中这样做吗?

Mysql 我可以在SQL语句中这样做吗?,mysql,sql,Mysql,Sql,假设我有一张邮政桌。但我想查询所有今日邮报。但是如果今天的帖子少于10篇,我将返回昨天的帖子进行查询。若超过10篇文章,则无需查询昨天的文章……若SQL语句不能做到这一点。这仅仅是通过手动调用post来实现的吗。。。。?多谢各位 ***数据库是MySQL 让我用一个典型的例子来澄清这个问题: 如果今天有5个帖子…只有。昨天有10个帖子 回复:今天5篇,昨天5篇 如果今天有10个帖子…只有。昨天有10个帖子 返回:10个今日帖子 你可以试试 select count(*) from post_ta

假设我有一张邮政桌。但我想查询所有今日邮报。但是如果今天的帖子少于10篇,我将返回昨天的帖子进行查询。若超过10篇文章,则无需查询昨天的文章……若SQL语句不能做到这一点。这仅仅是通过手动调用post来实现的吗。。。。?多谢各位

***数据库是MySQL

让我用一个典型的例子来澄清这个问题:

如果今天有5个帖子…只有。昨天有10个帖子

回复:今天5篇,昨天5篇

如果今天有10个帖子…只有。昨天有10个帖子

返回:10个今日帖子

你可以试试

select count(*) from post_table
where date = todays_date
如果结果大于10,则

select * from post_table
where date = today's date
否则

对的解决方案进行了微小的开发(将两个条件选择组合为一个,具有参数化限制):

选择@count:=count(*)
从post_表
其中日期=今天;
如果@count<10,则设置@count=10;
挑选*
从post_表
按日期说明订购
限制@计数;

更新

如文件所述:

LIMIT
子句可用于约束
SELECT
语句返回的行数<代码>限制接受一个或两个数值参数,这两个参数都必须是非负整数常量,但以下情况除外:

  • 在准备好的语句中,可以使用占位符标记指定
    限制
    参数

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


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

另一个想法,略短一点:

set @i = 0;
select *, @i := @i + 1
from post_table
where @i < 10 or date = today
order by date desc;
set@i=0;
选择*,@i:=@i+1
从post_表
其中@i<10或日期=今天
按日期说明订购;
不确定它是否非常有效

更新:很快! 我在这样的样本上进行了测试:

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
创建表a(i int主键,d日期不为空,索引idx(d))
设置@i=0;
插入a(i,d)
选择@i:=@i+1,添加日期(curdate(),间隔-(@i%1000)天)
从a,b,c

你需要获得10篇最新的帖子,不管它们是今天发布的还是昨天发布的,对吗?你使用的是什么RDBMS?另外,如果今天有9篇帖子,昨天有100篇,你想总共带回109篇,还是仅仅是前10篇?如果今天有60个帖子,它应该会把它们全部带回来?@DiagonalBatman-请让OP澄清要求。不要进行实际更改问题含义的编辑。对于所有人,我更新了我的问题以澄清。您仍然没有说明RDBMS如果您可以参数化
限制
,那么可能可以使用
联合所有
大小写
表达式来执行操作,其中涉及
找到的行
?不要在mo上安装MySQL进行测试。谢谢你,史密斯先生。我不知道FOUND_ROWS()”——布赖恩·霍珀先生在这个场合可能会这么说。如果他真的这么说,我可能会说:‘我也没有。谢谢你,史密斯先生。”。极限的参数化程度目前也是一个问题。简而言之,不能将表达式放在LIMIT之后,只能放在变量之后。类似于
UNION SELECT@count=10-FOUND_ROWS(),…其中@count>0 LIMIT@count
可能会这样做,但是…+1这只访问表一次。问题是一旦到达
@i<10
,它会停止扫描吗?我要添加一个条件
和日期
select * from post_table  
order by date desc
limit 10
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;
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