2016-10-05 2 views
0

Возможно ли использовать LEFT JOIN и использовать только 6 букв в ON?MySql 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 

master_listing стол

id   remarks 
    1   112233GOODAY 

courier_information стол

id  courierCode UID 
    1   112233  27 

К сожалению, мой запрос выше не работает, то она возвращает NULL.

Есть ли способ сделать это?

Заранее спасибо.

+0

Каков результат, когда вы выполняете 'SELECT *' вместо 'SELECT b.UID'? Это может помочь вам отладить. – Pang

+0

LEFT собирается вернуть строку, и я думаю, что курьером не является строка? Поэтому вам нужно преобразовать 'LEFT (a.remarks, 6)' в тот же тип данных, что и код курьера. Попробуйте бросить? – MageeWorld

+0

@Pang же результат NULL, но когда я просто использую 'a.remarks = b.courierCode' в' ON' его работу. –

ответ

3

Значение 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.

+0

Спасибо за этот замечательный ответ :) –

0

Попробуйте это:

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

Спасибо, но это не работает. –