从同一个表格

时间:2016-06-16 12:18:28

标签: mysql sql

我的数据库上有一个表,我有这些列:[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。 这可能是最好的解决方案,但我会满足于这些位置与其他人一一分享他们的数据......并且我可以通过编程方式进行循环。

3 个答案:

答案 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值,即12

答案 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