我每个月都有一张桌子: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
可以是一系列值,例如:
然后我在表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
)。
如何才能实现这一目标?
答案 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注入攻击。请改用参数化的预处理语句。