2016-04-12 12 views
1

2016年に有効期限が切れたクレジットカードを報告するクエリを書きました。実行されていますが、警告が表示され、その理由を詳しく知りたいと思います。サブクエリが原因だと思います。MySQL:サブクエリ:警告メッセージ意味

警告:不正なデータ値「2016%」行1

で列「exp_date」の私だけのための可能な2016の要件を満たしているが、警告が表示されている一つの値を有します同じ条件を満たす可能性のある将来価値?

SELECT customer_id as 'Customer' 
FROM customers 
WHERE credit_card_id = (
     SELECT credit_card_id 
     FROM credit_cards 
     WHERE exp_date LIKE '2016%' 
     LIMIT 1 
    ); 

クレジットカード値:

INSERT INTO credit_cards VALUES 
(1, '0025184796520000', '2016-08-13', 'Sarah', 'Jones', 3351, '2490 Paseo Verde parkway, suite 150', 'San Diego','CA',92124), 
(2, '7896541232548526', '2017-09-21', 'Desmond', 'Lowell', 1204, '3201 Kelsey Street, suite 109', 'San Diego','CA',92174), 
(3, '123456789', '2018-02-11', 'Mark', 'Jefferson', 1591, '876 Silverado Street, suite 304', 'Henderson','NV',89162), 
(4, '4001330852539605', '2017-01-10', 'Jaime', 'Evans', 8879, '924 Shady Pines Circle, suite 120', 'Summerlin','NV',89074); 
+0

Thアイは笑っていません。それは割り当てのために作られた偽のデータです。それが正しいとすれば、私はすべてをやめ、代わりに宝くじに勝つことを試みます。 – Sierra

+0

ああ、ありがとう。それは知っていると優れています...そしてはるかに良く見えます。 – Sierra

答えて

1

問題は、データ型DATE <>TEXTと失敗することがある'2016%' to DATE`からの暗黙的な変換です。

あなたは(ないSARGable)を使用することができます

SELECT customer_id as 'Customer' 
FROM customers 
WHERE credit_card_id = (
     SELECT credit_card_id 
     FROM credit_cards 
     WHERE YEAR(exp_date) = 2016 
    ); 

セカンド改善がJOINを使用することです:

それあなたが使用することができ SARGable作る
SELECT DISTINCT c.customer_id AS `Customer` 
FROM customers c 
JOIN credit_cards cc 
    ON cc.credit_card_id = c.credit_card_id 
WHERE YEAR(cc.exp_date) = 2016; 

そしてfinaly:

WHERE cc.exp_date >= '2016-01-01' AND cc.exp_date < '2017-01-01' 
+0

私はジョインを使うのが好きですが、これを忘れてしまった割り当てのどこかでサブクエリを使用する必要がありました。これが私のエスケープでした。しかし、私はより論理的な意味を持つような何かを選択しなければならないと思っています...しかし、解決策とYEAR(exp_date)= ...部分に感謝します、それは将来の機会に非常に役立ちます。 – Sierra