将值连接到字段而不创建重复项

时间:2017-10-27 12:04:32

标签: php mysql database

我每个月都有一张桌子:zaman_Jan,zaman_Feb,zaman_Mar,zaman_Apr,...,zaman_Dec。

此类表的列为:id,username,d01,d02,d03,d04,...,d31。

我使用以下insert语句在循环中插入值:

"INSERT INTO zaman_$month (username, d$day ) 
    VALUES ( '$value1' , '$value2' ) 
    ON DUPLICATE KEY UPDATE d$day = CONCAT(d$day,'$value2')"

其中$value1是用户名,$value2可以是一系列值,例如:

  • 5月06日星期五05:10:29 +0000 2016
  • 5月06日星期五05:10:29 +0000 2016
  • Fri May 06 15:08:29 +0000 2016

然后我在表zaman_May中得到以下内容:

id | username | d06
---+----------+---------------------------------------------------------------------------
 1 | value1   | Fri May 06 05:10:29 +0000 2016/Fri May 06 05:10:29 +0000 2016/Fri May 06 15:08:29 +0000 2016

但我不希望重复次数。它应该是:

id | username | d06
---+----------+---------------------------------------------------------------------------
 1 | value1   | Fri May 06 05:10:29 +0000 2016/Fri May 06 15:08:29 +0000 2016

所以我想在字段中添加每个新值(在示例中,在d06中),但是如果要合并到现有行的值(例如,字段具有15:15:15,则新值也是15:15:15),它应该跳过该值。只有当目标行中不存在要添加的值时,才应将其附加到现有值(如15:15:15-16:16:17)。

如何才能实现这一目标?

1 个答案:

答案 0 :(得分:0)

虽然您可以通过在where not exist语句中添加insert条件来使其工作,但数据库的整个设置从一开始就是错误的。

您应该规范化您的数据库。不要每月创建一个单独的表,不要每天创建一个单独的列,不要在一个字段中多次连接作为字符串。它会使您的数据操作过于复杂。

创建一个事实表,如下所示:

id | user_id | action_date
---+---------+-------------------------
 1 |     1   | 2016-05-06 05:10:29
 1 |     1   | 2016-05-06 05:08:29

如果您将这些列作为唯一索引的一部分,则无法为同一用户插入重复日期。

如果您有用户名称,请将其放在单独的user表中,其中主键为user_id

当您只需要一个月的数据时,只需将其置于where条件下(而不是动态选择正确的表格)。同样适用于每月的某一天:将日期的日期放在where子句中,而不是动态选择相应的日期列。

最后,不要通过动态插入$value1$value2来创建SQL语句,因为这会使您的代码容易受到SQL注入攻击。请改用参数化的预处理语句。