mysql join - 在连接表中包含空行

时间:2014-01-31 08:44:10

标签: mysql join null where

我有4个mysql表如下:

属性:

int          id
string       attribute

类:

int          id
string       category

产品:

int          id
int          category_id (fk categories.id)
string       name
...

attribute_category:

int          id
int          attribute_id (fk attributes.id)
int          category_id  (fk categories.id)

attribute_product

int          id
int          attribute_id (fk attributes.id)
int          product_id   (fk products.id)
string       value

产品具有许多属性,但可以具有的属性取决于产品所属的类别。

我希望与product表同时对product_attributes执行crud操作。

创建操作

我可以获得产品所需的属性:

SELECT 
    attributes.id, attributes.attribute 
FROM `attributes`
JOIN 
    `attribute_category`
ON 
    attributes.id = attribute_category.attribute_id
WHERE
    attribute_category.category_id = 1

编辑操作

编辑时,我需要能够使用attribute_product表连接上表。这个表应该做三件事:

  1. 确定产品需要哪些属性
  2. 列出现有产品属性值
  3. 如果产品属性值不存在,则应将null置于值
  4. 到目前为止我的查询:

    SELECT 
        attributes.id, 
        attributes.attribute,
        attribute_product.value
    FROM `attributes`
    JOIN 
        `attribute_category`
    ON 
        attributes.id = attribute_category.attribute_id
    LEFT JOIN
        `attribute_product`
    ON
        attributes.id = attribute_product.attribute_id
    WHERE
        attribute_category.category_id = 1 AND
        attribute_product.product_id = 1
    

    现在这个查询满足1和2的要求,但是我不知道我需要做什么来满足第3部分。如果尚未输入product_attribute但应该可用,我希望返回一行,其值为null。在第一个实例中,我认为我没有正确使用我的左连接,而在第二个实例中,通过在我的WHERE子句中声明product_id必须为1,我自动排除了我的空行。

    例如需要输出。

    attributes.id    attributes.attribute    attribute_product.value
    1                Weight                  35.5
    2                Height                  55.6
    3                Colour                  null
    7                Shape                   Round
    9                Manufacturer            null
    

    当前输出

    attributes.id    attributes.attribute    attribute_product.value
    1                Weight                  35.5
    2                Height                  55.6
    7                Shape                   Round
    

0 个答案:

没有答案