PHP SQL SELECT sum(value) WHERE x LIKE '%$month%' (foreach)

Posted

技术标签:

【中文标题】PHP SQL SELECT sum(value) WHERE x LIKE \'%$month%\' (foreach)【英文标题】:PHP SQL SELECT sum(value) WHERE x LIKE '%$month%' (foreach)PHP SQL SELECT sum(value) WHERE x LIKE '%$month%' (foreach) 【发布时间】:2017-12-07 19:24:45 【问题描述】:

我有一张桌子:

user_id |       month       | value
    1   | firstname_1_2017  |   5 
    1   | secondname_1_2017 |   4
    1   | firstname_2_2017  |   7 
    1   | secondname_2_2017 |   8
    1   | firstname_3_2017  |   5 
    1   | secondname_3_2017 |   4
    1   | firstname_4_2017  |   7 
    1   | secondname_4_2017 |   8

我需要一个 foreach 每个月的总和“值”。

firstname_1_2017 + secondname_1_2017 = 9

firstname_2_2017 + secondname_2_2017 = 15

我有几个月的数组:

$array_months = array( '1','2','3','4','5','6','7','8','9','10','11','12' );

所以我写了(在 php 中):

SELECT sum(value)
FROM table
WHERE user_id = $user_id
AND month LIKE '%_$array_months_2017%'

当我编写一个 foreach 时,结果是每个月重复的所有值的总和相同(例如:1 月 48 点、2 月 48 点、3 月 48 点...)。

我想要这个带有 foreach 的结果:

你在一月份有“9”分

你在二月份有“15”分

等等……

【问题讨论】:

想想你的数据库设计。在一列中存储多个信息是不好的 粘贴您的 PHP 代码,而不仅仅是 SQL 查询。 如果你想用 mysql 做所有的事情,你可以查看这个答案***.com/a/1647857/4641073。否则,您可以在 PHP 中选择行并在 PHP 中求和。 【参考方案1】:

您应该考虑更改数据库设计,将月份和年份与用户名分开。

这不是一个好方法,但解决方案是从 month 字符串中提取月份年份并将其分组以计算每个月的总和。

SELECT SUBSTR(month, LOCATE('_', month) + 1) AS month_year, SUM(value)
FROM users
WHERE user_id = 1
GROUP BY month_year;

Working Fiddle

【讨论】:

【参考方案2】:

您可以像这样使用the SUBSTRING_INDEX() function 从month 列值中提取数字,给出3_2017

SUBSTRING_INDEX('firstname_3_2017', '_', -2)

然后您可以将其转换为带有CONCAT()date-ish 字符串,生成1_3_2017

CONCAT('1_',SUBSTRING_INDEX('firstname_3_2017', '_', -2))

然后您可以使用STR_TO_DATE() 将其转换为实际的DATE 值。

STR_TO_DATE(CONCAT('1_',SUBSTRING_INDEX('firstname_3_2017', '_', -2)),'%d_%m_%Y')

很酷,现在您有了一个可以实际使用的数据类型。您现在可以使用聚合查询来获得好东西。利用 Samir 的小提琴:http://sqlfiddle.com/#!9/8aabd/6/0

SELECT 
  SUM(value) value,
  user_id,
  STR_TO_DATE(CONCAT('1_',SUBSTRING_INDEX(month, '_', -2)),'%d_%m_%Y') month_begin
  FROM table
 GROUP BY user_id, STR_TO_DATE(CONCAT('1_',SUBSTRING_INDEX(month, '_', -2)),'%d_%m_%Y')

总结:month 列的简单转换可以为您提供有用的信息。

专业提示:在设计表格时尽量不要将具有不同含义的值填充到单个列中。阅读规范化。

专业提示 2: 尽可能使用实际的 DATETIMESTAMPDATETIME 值来存储基于时间的信息。日期算术和基于日期的索引是 DBMS 服务器的强大部分。

【讨论】:

以上是关于PHP SQL SELECT sum(value) WHERE x LIKE '%$month%' (foreach)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select where LINE = MAXIMUM Value per Primary Key Oracle SQL Developer

PHP 循环 - SQL 性能不佳

SQL Server:带有内部 SELECT 和子 SELECT 的 SUM()。每次都出错

PHP

SQL 在 Select 中使用 SUM() 在视图上创建索引

MySql Sql MAX 和 SUM 错误