php - MySQL UNION ALL Issue 得到正确的结果

标签 php mysql union-all

我不是专家,为此困扰了几个小时。

我有两个表 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。这将为您提供 t1t2 中的所有序列号的列表:

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/

相关文章:

PHP Curl 和 Cookie

php - MYSQL 用逗号分隔关键字将字段与另一个字段匹配

PHP - 使用有效的访问 token 通过 Graph API 在 Facebook 上发布视频

MySQL 连接返回 Null

php - 新选项卡中的 Codeigniter 加载 View

mysql - 从 JOIN 显示更新表 #1064

php - 如何修复 "mysqli::real_connect(): SSL operation failed"错误?

Mysql:在group by中添加条件

mysql - 如何从一行中的字段创建单独的行?

mysql - 如何使用 UNION ALL 计算两个查询