Значение NULL, будет ожидаемая доходность по b.anycolumn
от операции a LEFT JOIN b
, когда нет «соответствие» строки найдены в b
. (Строки из a
будут возвращены, и MySQL будет возвращать NULL значения для всех столбцов из 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
Там что-то происходит, что вы не выявили. Я сделал предположения о типах столбцов.
Мое предположение (просто предположение) состоит в том, что в столбце есть ведущее пространство.
Для отладки этого вывода дополнительных столбцов для проверки значений ...
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
.
Каков результат, когда вы выполняете 'SELECT *' вместо 'SELECT b.UID'? Это может помочь вам отладить. – Pang
LEFT собирается вернуть строку, и я думаю, что курьером не является строка? Поэтому вам нужно преобразовать 'LEFT (a.remarks, 6)' в тот же тип данных, что и код курьера. Попробуйте бросить? – MageeWorld
@Pang же результат NULL, но когда я просто использую 'a.remarks = b.courierCode' в' ON' его работу. –