我有以下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 = ?
答案 0 :(得分:0)
通常,这意味着您没有在其中一个联接中显示所有必要的联接列,并且您获得了cartesian product。在数据库术语中,这意味着您正在加入一个表并希望加入一行,但多行符合条件,因此您实际上正在连接多个行。发生这种情况时,您将在结果中多次获得相同的行(示例中的产品行)。
如果您发布了一些测试数据会更好,所以可以确认这个方案,但是由于您没有,我建议您检查每个连接,以确保您没有获得给定产品的多行行。
我发现特别怀疑的一部分查询是这个联接:
INNER JOIN specifications ON products.sn LIKE CONCAT(\'%\', specifications.sn, \'%\') OR products.type LIKE CONCAT(\'%\', specifications.type, \'%\')
您正在使用LIKE
运算符加入,该运算符似乎很有可能获得多行。
答案 1 :(得分:0)
你的一个加入条件太松弛了
例如两个贷款记录指向同一产品。