使用PHP从CakePHP中的MySQL数据库合并重复记录

时间:2012-06-17 22:58:14

标签: php mysql cakephp-2.0

我有一个表格,用于存储已输入的有关垃圾箱中垃圾量的数据。所以我的表看起来像这样:

Material  |  Weight
===================
Paper     |  10
Plastic   |  5
Paper     |  7

如您所见,我将在表格中包含重复数据。目前,我有多个不同材料的实例,并且它们都附有不同的重量值。

在PHP中是否可以获取这些重复的条目,将它们合并到一个条目中,然后显示它们?那么代码将需要10Kg的纸张并将其添加到表格中的另一个纸张实例(7Kg)然后输出值?

我在MySQL中尝试了GROUP BY,但所有这些都将组合所有条目并给我顶级记录的值,这是不对的。

谢谢!

3 个答案:

答案 0 :(得分:3)

使用带有SUM列的MySql。这将为每个分组总结该列的所有值。这假设重量栏只是一个数字(10而不是10公斤)。

SELECT 
    `material`, 
    SUM(`weight`) AS `weight` 
FROM `material_weights` 
GROUP BY `material`

如果重量栏不仅仅是一个数字(10公斤而不是10公斤),那么就会出现问题。

如果所有权重都在KG中,那么您应该从每个权重中删除“kg”值,并将权重列从文本转换为数字列。

如果有不同种类的重量(KG,LB,G等),那么最好的方法是在表格中增加一个字段,将重量转换为KG。

答案 1 :(得分:1)

由于您的所有数据似乎都在字符串中,因此使用php迁移脚本检查数据然后组合重复项似乎最好。您要做的第一件事是确定哪些材料有重复。

  

SELECT材料FROM {TABLE} GROUP BY材料有COUNT(*)> 1;

从那里你应该遍历返回的材料,并使用材料值获取所有行。

  

SELECT * FROM {TABLE} WHERE Material ='{$ material}';

这将为您提供标记为Material的所有行。从那里,将任何转换(例如,如果有值标记为g的情况下)应用于数值,以确保您对相同类型的值进行操作。然后,您将删除具有该类型材料的所有行。 (你有备份,对吗?)

  

DELETE FROM {TABLE} WHERE Material ='{$ material}';

最后,插入您刚刚确定的值。

  

INSERT INTO {TABLE}(材料,重量),('$ material','$ weight');

答案 2 :(得分:1)

SELECT 
    material, 
    SUM(CAST(REPLACE(weight, 'kg', '') AS UNSIGNED)) AS weightsum
FROM
    tbl
GROUP BY
    material

您可以将SUM()功能与GROUP BY一起使用,以获得每种唯一材料的重量总和。在您的情况下,您的weight字段似乎是一个字符串。您可以使用REPLACE从每个值中取出“kg”,然后将其转换为整数,然后传递给SUM()