我的数据库上有一个表,我有这些列:[id,userId,locationId,created,update],我想要做的是将所有用户从一个位置插入到其他位置,但用户除外存在于第二个位置(如果这个新条目可以在创建和更新的列上具有此新插入的日期,那将是非常棒的)。我的意思是,如果我有这张桌子:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
假设实际时间是9999999,在插入操作之后,结果必须是:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
4 | 2 | 2 | 9999999 | 9999999
任何解决方案?感谢。
编辑(考虑更多案例)
还有一些我没有考虑过的信息。在这个例子中,只有一个方向的数据传输:信息从位置1到位置2.大多数情况下,因为位置2上没有用户,位置1没有。
完美的解决方案是转移进入两个方向,甚至使用超过2个位置,如下所示:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
4 | 3 | 2 | 1829384 | 0192837
5 | 4 | 3 | 8888833 | 9991828
6 | 5 | 4 | 1111111 | 2222222
假设实际时间是9999999,并且我想只涉及位置1,2和3,在插入操作之后,结果必须是:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
4 | 3 | 2 | 1829384 | 0192837
5 | 4 | 3 | 8888833 | 9991828
6 | 5 | 4 | 1111111 | 2222222
/*news*/
7 | 3 | 1 | 9999999 | 9999999
8 | 4 | 1 | 9999999 | 9999999
9 | 2 | 2 | 9999999 | 9999999
10 | 4 | 2 | 9999999 | 9999999
11 | 1 | 3 | 9999999 | 9999999
12 | 2 | 3 | 9999999 | 9999999
13 | 3 | 3 | 9999999 | 9999999
位置1,2和3共享其用户,但不共享位置4。 这可能是最好的解决方案,但我会满足于这些位置与其他人一一分享他们的数据......并且我可以通过编程方式进行循环。
答案 0 :(得分:1)
我将在userid - location字段上创建多列唯一索引。这样可以防止插入相同位置的重复用户ID。
然后使用insert ignore ... select ...
查询从其他位置插入用户。忽略意味着MySQL将忽略重复的密钥违规错误,并将继续插入有效的用户:
INSERT IGNORE INTO yourtable (userId, location, created, update)
SELECT userId, new_location, now(), now()
FROM youtable as t2
WHERE t2.location=current_location
new_location和current_location是您需要在查询中提供的参数。
答案 1 :(得分:0)
您可以使用如下查询:
INSERT INTO mytable (`userId`, `location`, `created`, `updated`)
SELECT userId, IF(location = 1, 2, 1), NOW(), NOW()
FROM mytable
GROUP BY userId
HAVING COUNT(DISTINCT location) = 1;
该查询假定id
字段是自动递增的,因此可以从INSERT
操作中排除。它还假设只有两个可用的location
值,即1
和2
。
答案 2 :(得分:0)
使用INSERT ....SELECT Statement
对于创建和更新日期,您可以使用MySQL UNIX_TIMESTAMP()
功能
喜欢这个
INSERT INTO LOCATION2 (id, userId, locationId, created, update)
SELECT id, userId, locationId, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() FROM LOCATION1