2012-02-22 54 views
1

我有一个表,很多看起来像这样的列:解决这个与SQL或PHP - 性能

id-name-date---pcs 
1 - x - 01-01 -10 
2 - y - 01-01 -15 
3 - z - 01-01 -8 
4 - x - 02-01 -25 
5 - y - 02-01 -10 
6 - z - 02-01 -5 

我希望做的是一个查询,显示个人电脑的开发/差异名,一个月antoher(在这种情况下,二月和Jan),这样之间:

id-name-pcs 
1 - x - (15) 
2 - y - (-5) 
3 - z - (-3) 

是否有可能只与SQL做到这一点还是需要涉及到PHP?

如果我循环遍历所有行并在PHP中进行计算,它是否会对服务器产生显着影响?

在此先感谢!

编辑:圆括号不是假设为查询结果的一部分。只为这个线程。

回答

2

我所用的技术是加入2月份部分表的部分月份,然后找到的差异。
看到查询波纹管(假设gsub是你的表名)

SELECT 
    g1.id, g1.name, g2.pcs-g1.pcs `pcs` 
FROM 
    gsub AS g1 
INNER JOIN 
    gsub AS g2 
ON 
    (g1.name=g2.name 
    AND 
    month(g1.`date`) = 1 
    AND 
    month(g2.`date`) = 2); 

结果

+----+------+------+ 
| id | name | pcs | 
+----+------+------+ 
| 1 | x | 15 | 
| 2 | y | -5 | 
| 3 | z | -3 | 
+----+------+------+ 
+0

嗯不能得到这个工作。我看到逻辑,但它返回0行。 我将它改为LIKE“2012-02%”和01%(我的格式是yyyy-mm-dd),但仍然没有成功。我在两个月内增加了两个相同的名字。 – Josef 2012-02-22 22:26:30

+0

@Josef你的'日期'列的格式是什么?也是'日期'类型? – 2012-02-22 22:28:11

+0

这是一个时间戳,yyyy-mm-dd hh:mm:ss,但应该像“2012-02%”这样的格式?我用它来分组和东西,这很好 – Josef 2012-02-22 22:32:17

0

我会做表的JOIN与自身,就像这样:

SELECT t1.name, t1.pcs AS 'pcs at 01-01', t2.pcs AS 'pcs at 02-02', t1.pcs - t2.pcs AS diff 
FROM table t1 
JOIN table t2 ON (t1.name = t2.name AND t2.date = '02-01') 
WHERE t1.date = '01-01'; 

注意t1t2是同一个表不同的别名。

另外:需要由特定的数据库表名被取代,日期必须是有效的格式('01 -01' 和'02 -01' 将无法正常工作 - 使用列类型的完整日期格式)。


对于更复杂的东西,我通常会做一个或两个数据库查询,并在PHP端执行计算。我曾经将一个花费一分钟时间的大型查询转换成几个混合了PHP循环的查询,后者几乎立即运行。

但是,就你而言,目标可以通过一个简单的SQL查询来实现,它不会损害性能。

+0

谢谢,但同样在这里,返回0行。是的,这就是为什么我问,这将是一个更复杂的查询。 – Josef 2012-02-22 22:29:00

+0

它应该工作。你是否已将date = '01 -01''更改为有效日期,并且查询中需要更改为特定需求的所有其他部分(表名等)? – 2012-02-22 22:37:06

+0

是的,不要错误。只有0行。 – Josef 2012-02-23 09:41:51

0

你问的方式,我甚至不应该回答(未来,告诉我们,你已经尝试过)。如果你还没有尝试任何事情,在开始时是这样的:

select name, sum(pcs) from mytable where cast(substring(date,0,2),UNSIGNED)<2 group by name order by sum(pcs) 
+0

谢谢!我刚刚意识到我的表述是不合理的。我还没有尝试过任何东西,因为我不知道如何开始。而且,我的问题是关于性能。我知道如何与PHP的帮助,这将是最简单的解决方案。但也许不是最好的。我会尽力与你的答案一起工作。 – Josef 2012-02-22 22:12:33

+0

重新阅读你的问题后,我认为你最好用上面的方法之一。我的东西只是增加了数量,这不是你想要的。 – mindandmedia 2012-02-22 22:15:13