【问题标题】:mysql db not recognizing valid joinmysql db无法识别有效连接
【发布时间】:2012-12-18 02:07:47
【问题描述】:

我不太确定问题出在哪里,我只知道数据库工作不正常。

两个显示一些基本的数据结构,表1是这样的

      name         | inGameID
Azure Plagioclase  |  17455
   Plagioclase     |  18
  viscous Pyroxeres|  17460
      Onyx Ochre   |  1232

表 2 类似于这样

  userName  |    item
     sam    |   Onyx Ochre
    mike    |   viscous Pyroxeres
     dave   |    azure plagioclase

尝试运行此查询时

SELECT fl.item, od.name 
FROM oreData od
JOIN fleetLog fl ON lower(od.name) = lower(fl.item)
order by fl.logID asc

结果只是缟玛瑙赭石值。什么时候应该返回更多的数据。 t1.name 和 t2.item 都具有相同的数据类型。我不确定需要更多的细节来帮助诊断这个问题,但我希望对此有更多的关注。我很乐意提供任何进一步的细节。我很抱歉这个太含糊了,我以前从未遇到过这样的问题

你们真是一针见血。在这些值的前面或结尾处都是额外的空白。解决这个问题的最佳方法是什么?

'39';'2';'1';'2001-03-13 00:14:27';'userName';'322';'Vivid Hemorphite
'
'38';'2';'1';'2001-03-13 00:19:28';'userName';'6386';'Azure Plagioclase
'

【问题讨论】:

  • 任何值的开头或结尾是否有多余的空格?您可以尝试发布select name,len(name) from oreDataselect item,len(item) from fleetLog 的结果吗?
  • 任一记录中是否有多余的空格?您也可以考虑删除 LOWER() 函数调用并改用不区分大小写的排序规则,例如ON od.name = fl.item COLLATE utf8_general_ci.
  • @eggyal 我试过有无,结果是一样的。
  • @mellamokb 我将运行这些并将它们粘贴到顶部
  • 你试过ON TRIM(od.name) = TRIM(fl.item)

标签: mysql join sqldatatypes


【解决方案1】:

你们真是一针见血。在这些值的前面或结尾处都是额外的空白。解决这个问题的最佳方法是什么?

  1. 修复您的应用程序代码,使此类数据不会进入数据库;如果这不可能,您可以在数据库中定义触发器,以便在写入操作期间根据需要去除字符:

    CREATE TRIGGER oreData_ins  BEFORE INSERT ON oreData  FOR EACH ROW
    SET NEW.name = TRIM(NEW.name);
    
    CREATE TRIGGER oreData_upd  BEFORE UPDATE ON oreData  FOR EACH ROW
    SET NEW.name = TRIM(NEW.name);
    
    CREATE TRIGGER fleetLog_ins BEFORE INSERT ON fleetLog FOR EACH ROW
    SET NEW.item = TRIM(NEW.item);
    
    CREATE TRIGGER fleetLog_upd BEFORE UPDATE ON fleetLog FOR EACH ROW
    SET NEW.item = TRIM(NEW.item);
    
  2. 更新现有数据:

    UPDATE oreData  SET name = TRIM(name);
    UPDATE fleetLog SET item = TRIM(item);
    

【讨论】:

  • 我正在使用正则表达式来解析数据。 $re = '/^(?<timeMined>[0-9]{2}:[0-9]{2}:[0-9]{2}) # timeMined \s+ (?<userName>[\w\s]+) # user name \s+(?:has\s+looted)\s+ # garbage text between name and amount (?<amount>\d+) # amount \s+x\s+ # multiplication symbol (?<item>.*)\s*$ # item name (to end of line) /xmu';
  • @mhopkins321:将<item>.*(贪婪匹配)更改为<item>.*?(懒惰匹配)。另请注意,如果原始字符串是 XML(不是正则语言),则无法使用正则表达式正确解析它:您应该改用 XML 解析器。
猜你喜欢
  • 2018-02-10
  • 2013-05-01
  • 1970-01-01
  • 2019-06-08
  • 2021-09-16
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多