2016-10-05 13 views
0

LEFT JOINに可能ですか?ONには6文字しか使用できませんか?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 b.UID'の代わりに' SELECT * 'を実行したときの出力は何ですか?それはデバッグに役立つかもしれません。 – Pang

+0

LEFTは文字列を返しますが、私の推測はcouriercodeは文字列ではありませんか?したがって、LEFT(a.remarks、6)を宅配番号と同じデータ型に変換する必要があります。キャストを試みますか? – MageeWorld

+0

@Pang同じ結果がNULLですが、 '' ON''で 'a.remarks = b.courierCode'を使っているだけです。 –

答えて

3

NULL値は、b.anycolumna LEFT JOIN bから操作するための期待収益であろう。 (aからの行が返され、MySQLはbからすべての列に対してNULL値を返します)

bの行が一致しない理由を尋ねているようです。比較テストがどの行でもTRUEを返さない理由

courierCode列のデータ型は、です。

条件a.remarks = b.courierCodeとクエリが一致する行を見つけないことを考えると、我々は'112233GOODAY'としてremarks列の値の例を示していることを考えると、我々は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と等しくありません。

+0

この素晴らしい答えをありがとう:) –

0

は、これを試してくださいbが見つかりません「一致」行が存在しない場合

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

ありがとうございますが、動作しません。 –