Mysql 每月从1-15和16-31中选择总和

Mysql 每月从1-15和16-31中选择总和,mysql,sql,Mysql,Sql,如果使用Limit 1..,则查询仅显示一条具有正确值的记录。。 我的问题是我的查询是好的还是错配了什么,因为如果我单独运行每个查询,它只返回一行,没有限制1。 谢谢你的帮助 我不太理解你的问题,但我认为你可以利用条件聚合: first : 150 second: 300 你有选择。。。来自收入。这将为收益表中的每行提供一个结果行。对于这些行中的每一行,选择两个和。一次又一次地重复同样的两个总数。如果您只是从收益中删除最后一行,这将告诉DBMS您只需要一行 如前所述,还有其他编写此查询的方法

如果使用Limit 1..,则查询仅显示一条具有正确值的记录。。 我的问题是我的查询是好的还是错配了什么,因为如果我单独运行每个查询,它只返回一行,没有限制1。
谢谢你的帮助

我不太理解你的问题,但我认为你可以利用条件聚合:

 first : 150 second: 300

你有
选择。。。来自收入
。这将为收益表中的每行提供一个结果行。对于这些行中的每一行,选择两个和。一次又一次地重复同样的两个总数。如果您只是从收益中删除最后一行,这将告诉DBMS您只需要一行

如前所述,还有其他编写此查询的方法。我就是这样做的:

SELECT
   user_id,
   SUM( (@var_day_of_month := DAYOFMONTH(date_earn)) BETWEEN 1 AND 15) * total ) First,
   SUM( (@var_day_of_month BETWEEN 16 AND 31) * total ) Second
FROM earnings
WHERE TRUE
# AND user_id = 3
# AND YEAR(date_earn) = 2020
# AND MONTH(date_earn) = 11
GROUP BY user_id
;
选择
总和(如果DAYOFMONTH(date_earn)=16,则为总结束)作为秒
来自收入
其中user_id=$userid
日期>=日期“2020-11-01”
日期_earn<日期'2020-12-01';

DATE\u格式(DATE\u earn,('%m'))='11'和。。而且..
不,不,真的不。这不是你要求数据库返回11月1日至15日之间所有日期的方式。
其中date\u earn>='2020-11-01'和date\u earn<'2020-11-16'
可以,不执行每行数据转换,保持使用索引的机会,并且严格来说不使用字符串比较数字(提示:
DATE\u格式(DATE\u earn,(“%d”))感谢您的回复。我将使用您的版本。但在查询中,我得到相同的348结果。具有完全相同的值…为什么?我不明白这个问题。为什么您有一个
+0
?在MySQL中,有更好的方法将日期从日期中提取出来,而不是将日期格式化为字符串,并通过添加0获得隐式转换。其中TRUE是不必要的sary(删除该子句),然后为表添加别名,然后再也不使用别名。可以(应该)使用标准SQL(CASE-WHEN)重写此查询,以便将来可以轻松地将其应用于另一个DB(对于OP或未来的访问者)(添加了另外两个建议)@CaiusJard不确定如何处理case,或者我目前拥有的内容如何不适用于标准sql。存在的原因仅仅是切换了其他条件。请参阅关于sql注入以及准备好的和绑定的查询的重要性谢谢,通过我的查询,我得到了370多个相同值的结果。通过您的查询,我只得到了有一个结果!谢谢!
SELECT
   user_id,
   SUM( (@var_day_of_month := DAYOFMONTH(date_earn)) BETWEEN 1 AND 15) * total ) First,
   SUM( (@var_day_of_month BETWEEN 16 AND 31) * total ) Second
FROM earnings
WHERE TRUE
# AND user_id = 3
# AND YEAR(date_earn) = 2020
# AND MONTH(date_earn) = 11
GROUP BY user_id
;
SELECT
  SUM( CASE WHEN DAYOFMONTH(date_earn) <= 15 THEN total END ) as first,
  SUM( CASE WHEN DAYOFMONTH(date_earn) >= 16 THEN total END ) as second
FROM earnings
WHERE user_id = $userid
AND date_earn >= DATE '2020-11-01'
AND date_earn <  DATE '2020-12-01';