Join in MYSQL and PHP


Join in MYSQL and PHP

我想从ProductsAttributesfeatures的三个表中获取数据一个产品可能具有多个功能和属性

我正在使用查询

select * 
from products p, features f, attributes a 
where p.id =1 and p.id = f.id and 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

附加信息

        在这里
阅读一些内容        MySQL JOIN 教程

这是

内联接,如果还想得到没有特征或属性的产品,就需要用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
您可能

希望通过将连接编写为 ANSI 来使其更易于阅读(我知道,提示 ANSI 与旧语法注释:))

select 
    * 
from 
    products p
        left join features f
            on p.id=f.id
        left join attributes a
            on p.id=a.id

不完全是,你的值颠倒了

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

但是,它不会按照您的要求进行操作,最好在这里执行三个查询 IMO。

对于必须获取所有三个表的数据的此类需求,应使用 Inner join。例如:

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 ) 

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