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: 尽可能使用实际的 DATE
、TIMESTAMP
或 DATETIME
值来存储基于时间的信息。日期算术和基于日期的索引是 DBMS 服务器的强大部分。
【讨论】:
以上是关于PHP SQL SELECT sum(value) WHERE x LIKE '%$month%' (foreach)的主要内容,如果未能解决你的问题,请参考以下文章
SQL Select where LINE = MAXIMUM Value per Primary Key Oracle SQL Developer
SQL Server:带有内部 SELECT 和子 SELECT 的 SUM()。每次都出错