mysql - 在同一个表的表上插入行

标签 mysql sql

我的数据库中有一个表,其中有以下列:[id,userId,locationId,created,update],我想要做的是将所有用户从一个位置插入到其他位置,除了以下用户存在于第二个位置(如果这个新条目可以在创建和更新的列上具有新插入的日期,那就太棒了)。我的意思是,如果我有这张 table :

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 上没有的用户。
完美的解决方案是传输朝两个方向进行,甚至使用两个以上的位置,如下所示:

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 不共享。 这可能是最好的解决方案,但我会满足于这些位置与其他位置一一共享数据......并且以编程方式我可以创建一个循环。

最佳答案

我会做什么,在用户 ID - 位置字段上创建一个多列唯一索引。这将防止在同一位置插入重复的用户 ID。

然后使用 insertignore ... 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 是您需要在查询中提供的参数。

关于mysql - 在同一个表的表上插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859005/

相关文章:

php - 比较从数据库返回的值与 json 返回的值

mysql - SQL INNER JOIN 与 DISTINCT 行?

mysql - 从选择返回是/否,无流量控制或向数据库添加表

php - 显示2个表的数据

mysql - 用于实时消息传递应用程序的 SQL vs nosql?

php - MySQL/PHP...寻找可能简单的问题的答案

Sql 条件非空约束

参数化查询中的 SQL 属性名称

sql - 使用 last_value+over 的大型 sql 表

mySQL GROUP BY 不同值相同