是否可以LEFT JOIN并且在ON中只使用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

不幸的是,我上面的查询不起作用,它返回空值。
有办法吗?
提前谢谢。

最佳答案

当在b.anycolumn中找不到“匹配”行时,空值将是a LEFT JOIN b操作的b的预期返回值。(将返回a中的行,MySQL将返回b中所有列的空值)
您似乎在问,为什么来自b的行不匹配;为什么比较测试对任何行都不返回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);

演示查询:
  SELECT b.UID
    FROM master_listing a
    LEFT
    JOIN courier_information b
      ON LEFT(a.remarks, 6) = b.courierCode
  ;

预期产出:
     UID
  ------
      27

有些事情你还没透露。我对列的数据类型做了假设。
我的猜测(只是猜测)是remarks列中有一个前导空格。
要调试此项,请输出其他列以检查值。。。
  SELECT a.id
       , a.remarks
       , LEFT(a.remarks,6)
       , HEX(a.remarks)
    FROM master_listing a
   WHERE a.id = 1

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

关于mysql - MySql左加入(前6个字母),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39864997/

10-11 01:15