MySql左连接打开(前6个字母)
是否可以在上的中左键联接并仅使用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
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)不能在
上的中使用。如果将其设置为右连接而不是左连接(或内部连接),会发生什么情况?为什么要使用左连接?