查询给出了两个相同的结果

时间:2012-10-15 15:51:10

标签: select join mysqli

我有以下SQL查询但是我遇到了一个问题: 当我执行它时,我从“products”表中的“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 = ?

2 个答案:

答案 0 :(得分:0)

通常,这意味着您没有在其中一个联接中显示所有必要的联接列,并且您获得了cartesian product。在数据库术语中,这意味着您正在加入一个表并希望加入一行,但多行符合条件,因此您实际上正在连接多个行。发生这种情况时,您将在结果中多次获得相同的行(示例中的产品行)。

如果您发布了一些测试数据会更好,所以可以确认这个方案,但是由于您没有,我建议您检查每个连接,以确保您没有获得给定产品的多行行。

我发现特别怀疑的一部分查询是这个联接:

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

您正在使用LIKE运算符加入,该运算符似乎很有可能获得多行。

答案 1 :(得分:0)

你的一个加入条件太松弛了

例如两个贷款记录指向同一产品。