对不起,令人困惑的标题。可悲的是,文字更加混乱。
基本上,我有一个将数据从一个表导入到另一个表的 SQL 脚本,并且我试图忽略某些行。
第一个表记录每个“事件”三行,我只想要其中一个。我想忽略的事件是两个几乎重复的事件,但一列是 0 而不是 1,以及时间,可能会有所不同。我给它一个 20 秒的限制,让它仍然匹配。
这是我到目前为止所拥有的:
INSERT INTO prism_actions (action_time, action_type, player, world, x, y, z, data)
SELECT FROM_UNIXTIME(`co_blocks`.time),
'block-shift',
'Piston',
CASE WHEN `co_blocks`.wid = 1 THEN 'world' ELSE (CASE WHEN `co_blocks`.wid = 2 THEN 'world_nether' ELSE 'world_the_end' END) END,
SUBSTRING_INDEX( `co_blocks`.bcords , '.', 1 ), -- This will get the X coordinate of this action
SUBSTRING_INDEX(SUBSTRING_INDEX( `co_blocks`.bcords , '.', 2 ),'.', -1), -- Y coordinate
SUBSTRING_INDEX(SUBSTRING_INDEX( `co_blocks`.bcords , '.', 3 ),'.', -1), -- Z
CONCAT("{\"block_id\":", `co_blocks`.type, ",\"block_data\":", `co_blocks`.data, "}")
FROM `co_blocks`
WHERE `co_blocks`.user LIKE '#piston'
AND `co_blocks`.action = 1
AND NOT (EXISTS(
SELECT `id` FROM `co_blocks` WHERE user LIKE '#piston' AND action = 0 AND time < (`co_blocks`.time + 20) AND time > (`co_blocks`.time - 20) AND `co_blocks`.bcords LIKE bcords))
ORDER BY id ASC;
EXISTS()
声明中的内容WHERE
是我试图检查是否有几乎重复的记录。
我的问题是,我正在使用co_blocks
.time 检查第一个SELECT
列的时间。我不知道它会使用第一个SELECT
时间还是第二个时间。
SELECT `id`
FROM `co_blocks`
WHERE user LIKE '#piston'
AND action = 0
AND time < (`co_blocks`.time + 20)
AND time > (`co_blocks`.time - 20)
AND `co_blocks`.bcords LIKE bcords
它使用相同的表名。我将如何使用第一个SELECT
的数据签WHERE
入第二个SELECT
?
编辑: 这是我开始的一些示例数据:
+------+------+------+------------+---------+------------+------+------+--------+------+------+
| id | cx | cz | time | user | bcords | type | data | action | rb | wid |
+------+------+------+------------+---------+------------+------+------+--------+------+------+
| 2147 | 22 | 17 | 1361130494 | #piston | 359.67.276 | 3 | 0 | 1 | 0 | 1 |
| 2148 | 22 | 17 | 1361130494 | #piston | 359.67.276 | 3 | 0 | 0 | 0 | 1 |
| 2149 | 22 | 17 | 1361130494 | #piston | 358.67.276 | 3 | 0 | 1 | 0 | 1 |
我只想从最后一行导入数据(bcords 不同,action=1)
编辑2:
我应该对此提供更多背景信息。我正在尝试从一个表中获取数据co_blocks
,并将其放入另一个表中,prism_actions
。使用此操作的程序prism_actions
仅使用一行,而使用的程序co_blocks
使用 3。我只是想从中获取正确的操作co_blocks
并将其放入prism_actions
。
编辑 3:
这是我遇到问题的另一个例子,希望它能让它更容易理解。在我的表中有值,我希望有两个语句将每个表中的信息相互比较。
UPDATE co_pistons
SET x = (SELECT SUBSTRING_INDEX( bcords , '.', 1 ) FROM `co_pistons` WHERE
`co_pistons`.bcords LIKE bcords
LIMIT 1)
WHERE NOT isFrom;
在第 3 行,co_pistons
.bcords 和 .bcordsbcords
指的是同一件事。我希望co_pistons
.bcords 指代UPDATE
的 bcords,所以我可以将它们相互比较。