是否可以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/