我想从三个表中获取数据Products
,Attributes
并且features
一个产品可能具有多个功能和属性
我正在使用查询
select *
from products p, features f, attributes a
where p.id =1 and p.id = f.id and p.id = a.id
我想知道查询是否正常???
这是内连接,如果你也想得到没有特征或属性的产品,你需要使用LEFT JOIN
. 并且您需要使用外键进行连接,例如p.feature_id
和p.attribute_id
。
SELECT *
FROM products p
LEFT JOIN features f ON p.feature_id = f.id
LEFT JOIN attributes a ON p.attribute_id = a.id
WHERE p.id = 1
您可能希望通过将连接编写为 ANSI 来使其更易于阅读(我知道,提示 ANSI 与旧语法注释:))
select
*
from
products p
left join features f
on p.id=f.id
left join attributes a
on p.id=a.id
您正在使用ANSI SQL-89
语法。但我会建议使用ANSI SQL-92
语法。示例如下:
SELECT *
FROM products p
INNER JOIN features f
ON p.id = f.id
INNER JOIN attributes a
ON p.id = a.id
where p.id =1
这样,您必须明确定义它们的关系(子句ON
)以避免语法错误。语法容易出错,ANSI SQL-89
您可能不会注意到它,因为它不会产生错误。例子
SELECT *
FROM products p, features f, attributes a
where p.id =1
如果不定义关系字段,它仍然会执行,但会给你无效的结果。从INNER JOIN
, 现在CROSS JOIN
附加信息
不完全是,你的价值观颠倒了
SELECT * FROM
products p,
features f,
attributes a
WHERE
p.id = 1 AND
f.id = p.id AND
a.id = p.id
但是,它不会满足您的要求,最好在这里执行三个查询 IMO。
对于必须获取所有三个表的数据的此类要求,您应该使用内连接。例如:
SELECT p.prduct_id,p.product_name,a.attribute,f.feature
FROM product AS p
INNER JOIN attribute AS a ON ( p.product_id = a.attribute_id )
INNER JOIN feature AS f ON ( a.id = f.feature_id )
像上面的查询一样,您应该在父表产品的属性和特征表中有外键。