MySql LEFT JOIN ON(前 6 个字母)

ang*_*nod 2 mysql

是否可以LEFT JOIN只使用 6 个字母ON

这是我的代码。

 SELECT 
    b.UID
 FROM master_listing AS a
 LEFT JOIN courier_information AS b ON LEFT(a.remarks, 6) = b.courierCode
Run Code Online (Sandbox Code Playgroud)

master_listing表

 id         remarks
  1         112233GOODAY
Run Code Online (Sandbox Code Playgroud)

快递信息表

 id      courierCode   UID
  1         112233      27
Run Code Online (Sandbox Code Playgroud)

不幸的是我上面的查询不起作用,它返回 NULL。

有什么办法可以做到这一点吗?

提前致谢。

spe*_*593 5

当 中没有找到“匹配”行时,操作的b.anycolumn预期返回值为 NULL 。(将返回 中的行,并且 MySQL 将为 中的所有列返回 NULL 值。)a LEFT JOIN bbab

看起来您在问为什么行 fromb不匹配;为什么比较测试没有为任何行返回 TRUE。

您省略的是列的数据类型courierCode

假设带有条件的查询a.remarks = b.courierCode确实找到了匹配的行,并且假设列中的示例值显示remarks'112233GOODAY',我们推测该remarks列是字符类型。

我们还可以得出结论,比较不是针对字符串值。

在数字上下文中计算时,字符串值'112233GOODAY'将被解释为 的数值112233。所以我们知道发生了隐式数据类型转换,正在remarks转换为数字。函数返回时应该发生相同的转换LEFT()

演示设置:

  CREATE TABLE master_listing 
  ( id          INT UNSIGNED PRIMARY KEY
  , remarks     VARCHAR(12) 
  );
  INSERT INTO master_listing (id, remarks)
  VALUES (1,'112233GOODAY');

  CREATE TABLE courier_information 
  ( id          INT UNSIGNED PRIMARY KEY
  , couriercode INT UNSIGNED 
  , uid         INT UNSIGNED 
  );
  INSERT INTO courier_information (id, couriercode, uid)
  VALUES (1,112233,27);
Run Code Online (Sandbox Code Playgroud)

演示查询:

  SELECT b.UID
    FROM master_listing a
    LEFT
    JOIN courier_information b 
      ON LEFT(a.remarks, 6) = b.courierCode
  ;
Run Code Online (Sandbox Code Playgroud)

输出如预期:

     UID  
  ------
      27
Run Code Online (Sandbox Code Playgroud)

有一些事情正在发生,你还没有透露。我已经对列的数据类型做出了假设。

我的猜测(只是猜测)是该remarks列中有一个前导空格。

为了调试这个,输出额外的列来检查值......

  SELECT a.id
       , a.remarks
       , LEFT(a.remarks,6)
       , HEX(a.remarks)
    FROM master_listing a
   WHERE a.id = 1
Run Code Online (Sandbox Code Playgroud)

如果该remarks值有前导空格,则 的LEFT(remarks,6)计算结果为' 11223',并且在数字上下文中进行比较,结果不等于112233