2016-04-12 43 views
1

2016'da kullanım süresi dolmak üzere olan kredi kartlarını bildirmek için bir sorgu yazdım. Çalışıyor, ancak bir uyarı alıyorum ve neden hakkında daha fazla bilgi edinmek istiyorum. Sanırım alt sorgu yüzünden.MySQL: Subquery: Uyarı İleti Anlamı

UYARI: Yanlış veri değeri: kolon 'EXP_DATE' için '2016%' satıra 1

sadece 2016 şartını karşılayan, fakat olası görünen uyarı olan bir değere sahip

aynı koşulu karşılayabilecek gelecekteki değerler?

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 
    ); 

Kredi Kartı değerler:

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 ey lol değil. Bir ödev için yapılmış sahte veriler. Eğer herhangi biri doğruysa, her şeyi bırakacağım ve bunun yerine piyangoyu kazanmaya çalışacağım. – Sierra

+0

Oh, çok teşekkür ederim. Bu bilmek güzel ... ve daha iyi görünüyor. – Sierra

cevap

1

sorun veritiplerini DATE <>TEXT ve başarısız zorundadır '2016%' to DATE` gelen örtük dönüştürme olduğunu.

Sen (SARGable değil) kullanabilirsiniz:

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

İkinci gelişme JOIN kullanmaktır:

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; 

Ve nihayet o SARGable şunu kullanabilirsiniz yapmak:

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

Bir katılımı kullanmayı tercih ettiğim kadarıyla, bu ayrılmamış ödevin bir bölümünde bir alt sorgu kullanmalıyım ve bu benim kaçışımdı. Ama sanırım daha mantıklı bir mantık yaratan başka bir şey seçmek zorunda kalacağım. Ama çözüm ve YEAR (exp_date) = ... parçası için teşekkürler, bu da gelecekteki durumlar için çok yararlı. – Sierra