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

编辑2:

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 = ?
4

2 回答 2

0

通常,这意味着您的一个联接中没有所有必要的联接列,并且您得到的是笛卡尔积。在数据库术语中,这意味着您要连接到一个表并希望连接到单行,但多行符合条件,因此您实际上要连接多行。发生这种情况时,您将在结果中多次获得同一行(在您的示例中为产品行)。

如果您发布一些测试数据以便可以确认这种情况会更好,但由于您没有,我建议您检查每个联接以确保您没有为给定的产品行返回多行。

我特别怀疑您的查询的一部分是这个连接:

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

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

于 2012-10-15T15:55:00.193 回答
0

那么你的加入条件之一太松了

例如,两个指向同一产品的借贷记录。

于 2012-10-15T16:04:18.567 回答