MySql左连接打开(前6个字母)

MySql左连接打开(前6个字母),mysql,Mysql,是否可以在上的中左键联接并仅使用6个字母 这是我的密码 SELECT b.UID FROM master_listing AS a LEFT JOIN courier_information AS b ON LEFT(a.remarks, 6) = b.courierCode 主列表 id remarks 1 112233GOODAY 信使信息表 id courierCode UID 1 112233

是否可以在上的中左键联接并仅使用6个字母

这是我的密码

 SELECT 
    b.UID
 FROM master_listing AS a
 LEFT JOIN courier_information AS b ON LEFT(a.remarks, 6) = b.courierCode
主列表

 id         remarks
  1         112233GOODAY
信使信息表

 id      courierCode   UID
  1         112233      27
不幸的是,我上面的查询不起作用,它返回NULL

有没有办法做到这一点

提前感谢。

试试这个:

CONVERT(LEFT(a.remarks,6), UNSIGNED INTEGER)
试试这个:

CONVERT(LEFT(a.remarks,6), UNSIGNED INTEGER)

如果在
b
中找不到“匹配”行,则
b.anycolumn
的预期返回值将为NULL。(将返回
a
中的行,MySQL将为
b
中的所有列返回空值)

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

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

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

我们还可以得出这样的结论:比较不是基于字符串值

在数值上下文中计算,字符串值
'112233GOODAY'
将被解释为
112233
的数值。因此,我们知道有一个隐式数据类型转换正在发生,
备注
正在转换为数值。从
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);
演示查询:

  SELECT b.UID
    FROM master_listing a
    LEFT
    JOIN courier_information b 
      ON LEFT(a.remarks, 6) = b.courierCode
  ;
按预期产出:

     UID  
  ------
      27
有件事你没有透露。我已经对列的数据类型进行了假设

我的猜测(只是猜测)是
备注
列中有一个前导空格

要调试此功能,请输出其他列以检查值

  SELECT a.id
       , a.remarks
       , LEFT(a.remarks,6)
       , HEX(a.remarks)
    FROM master_listing a
   WHERE a.id = 1

如果
备注
值有前导空格,则
左侧(备注,6)
将计算为
'11223'
,并在数字上下文中进行比较,这不等于
112233

当在
b
中找不到“匹配”行时,NULL值将是
b.anycolumn
A LEFT JOIN b
操作中的预期返回值。(将返回
a
中的行,MySQL将为
b
中的所有列返回空值)

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

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

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

我们还可以得出这样的结论:比较不是基于字符串值

在数值上下文中计算,字符串值
'112233GOODAY'
将被解释为
112233
的数值。因此,我们知道有一个隐式数据类型转换正在发生,
备注
正在转换为数值。从
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);
演示查询:

  SELECT b.UID
    FROM master_listing a
    LEFT
    JOIN courier_information b 
      ON LEFT(a.remarks, 6) = b.courierCode
  ;
按预期产出:

     UID  
  ------
      27
有件事你没有透露。我已经对列的数据类型进行了假设

我的猜测(只是猜测)是
备注
列中有一个前导空格

要调试此功能,请输出其他列以检查值

  SELECT a.id
       , a.remarks
       , LEFT(a.remarks,6)
       , HEX(a.remarks)
    FROM master_listing a
   WHERE a.id = 1

如果
备注
值有前导空格,则
左侧(备注,6)
将计算为
'11223'
,并在数字上下文中进行比较,这不等于
112233

当您执行
选择*
而不是
选择b.UID
时,输出是什么?这可能有助于调试。LEFT将返回字符串,我猜couriercode不是字符串?因此,您需要将
LEFT(a.comments,6)
转换为与快递代码相同的数据类型。试一试Cast?@Pang相同的结果为空,但当我在
ON
中使用
a.comments=b.courierCode
时,它就工作了。@mageworld我不认为它在数据类型上,它们都是字符。我认为LEFT(a.备注,6)在上的
中无效。如果将其设置为右连接而不是左连接-或内部连接-会发生什么情况?为什么要使用左连接?当您将
选择*
而不是
选择b.UID
时,输出是什么?这可能有助于调试。LEFT将返回字符串,我猜couriercode不是字符串?因此,您需要将
LEFT(a.comments,6)
转换为与快递代码相同的数据类型。试一试Cast?@Pang相同的结果为空,但当我在
ON
中使用
a.comments=b.courierCode
时,它就工作了。@mageworld我不认为它在数据类型上,它们都是字符。我认为LEFT(a.comments,6)不能在
上的
中使用。如果将其设置为右连接而不是左连接(或内部连接),会发生什么情况?为什么要使用左连接?