【问题标题】:MySQL table left join not matching (MySQL, Python)MySQL 表左连接不匹配(MySQL、Python)
【发布时间】:2019-05-15 08:52:14
【问题描述】:

已解决,请参阅 cmets 和解决方案

我有 2 个抓取工具,它们将抓取的数据存储在 2 个 SQL 表中:cpucpubench

cpu 包含:名称、价格、id(这在爬虫中不是恒定的)、标记

cpubench 包含:名称、标记、cpurank

这是来自这些表的 sn-p:

CPU

name price id mark AMD Ryzen 5 2600 $259.00 jLF48d 0 Intel Core i7-8700K $573.74 sxDzK8 0 AMD Ryzen 7 2700X $449.69 bddxFT 0 Intel Core i5-8600K $396.39 Mr2rxr 0 AMD Ryzen 3 2200G $145.00 RkJtt6 0 Intel Core i9-9900K $829.61 jHZFf7 0 AMD Ryzen 5 2600X $300.00 6mm323 0 Intel Core i5-9600K $419.00 28qhP6 0 Intel Core i7-9700K $659.00 WtyV3C 0 AMD Ryzen 5 1600 $232.61 mV98TW 0

cpubench

name mark cpurank AMD Ryzen 5 2600 13527 160 Intel Core i7-8700K 15962 98 AMD Ryzen 7 2700X 16971 75 Intel Core i5-8600K 12786 175 AMD Ryzen 3 2200G 7325 503 Intel Core i9-9900K 20150 37 AMD Ryzen 5 2600X 14342 135 Intel Core i5-9600K 13498 162 Intel Core i7-9700K 17379 69 AMD Ryzen 5 1600 12264 187

注意:

两个表中的所有列都是 VARCHAR(255)

表格并没有按照这个确切的顺序排列名称。

我正在使用以下 python 代码:

mycursor = mydb.cursor()

sql = ("SELECT cpu.id, cpu.name, cpu.price, cpubench.mark FROM cpu LEFT JOIN 
cpubench ON cpu.name = cpubench.name")

mycursor.execute(sql)

运行没有错误。

但是cpu中所有的mark值都是空的。

我该如何解决/解决这个问题?

任何帮助将不胜感激。

更新

我创建了一个有效的 SQL 小提琴:https://www.db-fiddle.com/f/sngju1uUBNMF56eVVTYu6H/3

我已经在 python 中尝试了 fiddle 中的代码,但所有 cpu.mark 值都为空。

谢谢

【问题讨论】:

  • “cpubench.mark”是否为空值?
  • 你可以试试UPPER(TRIM(cpu.name)) = UPPER(TRIM(cpubench.name)),可能实际数据有一些空格
  • @Vivek cpubench.mark 包含值但是在运行我的代码后 cpu.mark 只有 null 值
  • @Vivek 我已经使用 MySQL 工作台比较了 cpu.name 和 cpubench.name 中的名称值,但我会试一试,那会去哪里?
  • 代替sql = ("SELECT cpu.id, cpu.name, cpu.price, cpubench.mark FROM cpu LEFT JOIN cpubench ON cpu.name = cpubench.name"),使用sql = ("SELECT cpu.id, cpu.name, cpu.price, cpubench.mark FROM cpu LEFT JOIN cpubench ON UPPER(TRIM(cpu.name)) = UPPER(TRIM(cpubench.name))")

标签: python mysql mysql-python


【解决方案1】:

作为每个 cmets,我在这里绑定最终解决方案:

update cpu 
join cpubench on UPPER(TRIM(cpu.`"name"`)) = UPPER(TRIM(cpubench.`"name"`)) 
set cpu.`"mark"` = cpubench.`"mark"`;

SELECT * FROM cpu;

【讨论】:

  • 目前我有: sql = ("update cpu join cpubench on UPPER(TRIM(cpu.name)) = UPPER(TRIM(cpubench.name)) set cpu.mark = cpubench.mark ") 见上面的 cmets 但这似乎不起作用。谢谢
  • mycursor = mydb.cursor() sql = ('update cpu join cpubench on UPPER(TRIM(cpu."name")) = UPPER(TRIM(cpubench."name")) set cpu."mark"` = cpubench."mark"') mycursor.execute(sql) sql = ('select * from cpu' ) mycursor.execute(sql)`
  • 用这行代码:sql = ('update cpu join cpubench on UPPER(TRIM(cpu."name")) = UPPER(TRIM(cpubench."name")) set cpu." mark" = cpubench."mark"') 我收到错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '"name")) = UPPER(TRIM(cpubench."name")) set cpu."mark" = cpubench."mark"' 附近使用正确的语法1
  • 好的,现在我有了: sql = ("update cpu join cpubench on UPPER(TRIM(cpu.name)) = UPPER(TRIM(cpubench.name)) set cpu.mark = cpubench.mark ”)。但是它似乎仍然不起作用?
  • 好的,所以我的小提琴工作了:db-fiddle.com/f/sngju1uUBNMF56eVVTYu6H/4 我在 python 中使用了该代码,但它不起作用:mycursor = mydb.cursor() sql = ("update cpu join cpubench on UPPER(TRIM(cpu.name)) = UPPER(TRIM(cpubench.name)) 设置 cpu.mark = cpubench.mark") mycursor.execute(sql)
猜你喜欢
  • 2015-07-08
  • 2015-01-25
  • 2015-07-12
  • 1970-01-01
  • 2012-11-13
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多