0

对不起,令人困惑的标题。可悲的是,文字更加混乱。

基本上,我有一个将数据从一个表导入到另一个表的 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,所以我可以将它们相互比较。

4

1 回答 1

0

作为解决方案,我最终创建了一个单独的表,并添加了我需要使用的所有数据。然后,我可以将子查询中的表数据与主查询的数据进行比较。我不确定这是否太高效,但对于我的脚本来说它对我来说很好,因为脚本只运行一次。如果有人有任何更好的想法会很棒,但否则这对我有用。

编辑

我的问题实际上是我不知道如何使用AS不同的方式命名表。这导致我在查询中使用了两个同名的表,这最终让我感到困惑。解决方案是用昵称命名表:

FROM `co_blocks` as c1
...
SELECT `co_blocks` as c2 WHERE c1.bcords = c2.bcords

我想,以前的解决方案是可行的,但这绝对不是最好的方法。

于 2013-02-18T17:54:28.327 回答