0

我想从三个表中获取数据ProductsAttributes并且features 一个产品可能具有多个功能和属性

我正在使用查询

select * 
from products p, features f, attributes a 
where p.id =1 and p.id = f.id and p.id = a.id

我想知道查询是否正常???

4

5 回答 5

1

这是内连接,如果你也想得到没有特征或属性的产品,你需要使用LEFT JOIN. 并且您需要使用外键进行连接,例如p.feature_idp.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
于 2012-08-09T09:05:49.877 回答
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
于 2012-08-09T09:06:01.713 回答
1

您正在使用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

附加信息

        在这里阅读一些东西
        MySQL JOIN 教程

于 2012-08-09T09:09:43.983 回答
0

不完全是,你的价值观颠倒了

SELECT * FROM
  products   p,
  features   f,
  attributes a
WHERE
  p.id = 1    AND
  f.id = p.id AND
  a.id = p.id

但是,它不会满足您的要求,最好在这里执行三个查询 IMO。

于 2012-08-09T09:05:35.473 回答
0

对于必须获取所有三个表的数据的此类要求,您应该使用内连接。例如:

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 ) 

像上面的查询一样,您应该在父表产品的属性和特征表中有外键。

于 2012-08-09T09:15:36.813 回答