2012-10-15 136 views
0

我有以下SQL查詢,但我得到了一個問題: 當我執行它時,我從「產品」表中的「sn」列中獲得了兩個相同的序列號。查詢給出了兩個相同的結果

SELECT specifications.productname, 
products.sn, specifications.year, 
lendings.lending_date 
FROM products 
INNER JOIN lendings ON products.id = lendings.product_id 
INNER JOIN specifications ON products.sn LIKE CONCAT(\'%\', specifications.sn, \'%\') OR products.type LIKE CONCAT(\'%\', specifications.type, \'%\') 
WHERE lendings.user_id = ? 

編輯:

身外之物表:

user_id  product_id 
1    1 
1    2 
2    3 

規格表:

productname year  type  sn 
name1   2012  1  1234 
name2   2011  2  4321 
name3   2010  3  3241 

產品表:

id   sn 
1    AAAAAAAA1234 
2    BBBBBBBB4321 
3    CCCCCCCC3241 

EDIT2:

SELECT products.id, 
     specifications.productname, 
     products.sn, 
     specifications.year, 
     lendings.lending_date 
FROM products 
INNER JOIN lendings ON products.id = lendings.product_id 
INNER JOIN specifications ON products2.sn LIKE CONCAT(specifications.sn, \'%\') OR products.type = specifications.type 
WHERE lendings.user_id = ? 

回答

0

通常情況下,這意味着你沒有所有的necesary加入存在於你加入一個列,你得到一個cartesian product。用數據庫術語來說,這意味着你要加入到一個表中,並希望加入到一行中,但是多行匹配標準,所以你實際上加入了多行。發生這種情況時,您會在結果中多次獲取同一行(示例中的產品行)。

如果您發佈了一些測試數據以便可以確認此場景,但由於您沒有,我會建議檢查您的每個連接以確保您沒有獲取給定的多行產品行。您查詢的

一個部分我覺得特別疑是這個連接:

INNER JOIN specifications ON products.sn LIKE CONCAT(\'%\', specifications.sn, \'%\') OR products.type LIKE CONCAT(\'%\', specifications.type, \'%\') 

您使用的是LIKE運營商,這似乎有越來越多行的機會很高的加盟。

+0

這是因爲規格表只包含一些序列號。 – user1273409

+0

但是,如果它連接到多個規格行,即使規格僅包含一些序列號,它也會混淆您的結果。如果你可以發佈你的完整數據例子,它會有很大的幫助。 – dcp

+0

是否可以比較specifications.sn和products.sn中僅有的4個數字?有時它只是最後3個,也可能是typenumber。取決於產品 - 這有點棘手:( – user1273409

0

你的一個加入的條件,然後

過於鬆弛,例如指向同一個產品分類二身外之物記錄。

+0

不,它不會不看我的編輯。 – user1273409

相關問題