我不是专家,为此困扰了几个小时。
我有两个表 t1 和 t2,需要更新 t1 中与 t2 匹配的每一行。 t1 包含格式为 xxx-xxx-xxx-xxx-xxx 的 serialkey 字段 t2 包含格式为 xxxxxxxxxxxxxxx 的 serialkey 字段
我以为我可以使用 UNION ALL,但我没有实现我想要做的事情。由于一张表包含带破折号的序列,我想像这样删除它们。
SELECT serialkey FROM
(SELECT replace(serialkey,'-','') as serialkey FROM t1
UNION ALL
SELECT serialkey FROM t2 ) tbl
GROUP BY serialkey
我还尝试了一个 HAVING 计数,尽管在第一个和第二个版本中我似乎无法获得计数,也无法对它们进行分组,以找到 t1 中与 t2 中匹配的所有行意图然后更新 t2 中的列以说找到匹配项(这样我只需要运行一次)。
SELECT serialkey
FROM (
SELECT replace(serialkey,'-','') serialkey FROM t1
UNION ALL
SELECT serialkey FROM t2
) tbl
GROUP BY serialkey
HAVING count(*)= 2 <<--- 2 shows none and 1 shows all rows combined
ORDER BY serialkey;
最后请注意,t1 将包含大约 150,000 行,而 t2 将包含大约 300,000 行; t1 和 t2 之间可能有大约 110,000 个匹配项,我想按上述方式编辑 (PHP)。我也尝试了一些左连接,结果在 15 分钟内无法访问 phpmyadmin,这可能是我自己的问题,尽管我猜这个查询相当大,需要最好的代码。
上面的两个结果只是列出了我在两个表中的所有记录!
感谢任何帮助,谢谢。
克里斯
最佳答案
将 serialkey
值在一个表中格式化并在另一个表中取消格式化几乎会扼杀任何优化查询的机会,但对于 300K 行,它不应该花费 那么 时间- 可能很多秒而不是很多分钟。
基本上您需要的是 INNER JOIN
。这将为您提供 t1
和 t2
中的所有序列号的列表:
SELECT t1.SerialKey
FROM t1
JOIN t2 ON REPLACE(t1.SerialKey, '-', '') = t2.SerialKey
您可以在更新中使用相同的连接逻辑:
UPDATE t1
JOIN t2 ON REPLACE(t1.SerialKey, '-', '') = t2.SerialKey
SET t1.whatever = 'whatever'
关于php - MySQL UNION ALL Issue 得到正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049933/