我试图编写一个从3个表中提取的sql查询,但未能获得所需的结果。我想返回与特定类别配对的所有属性名称(标签),并将这些属性与来自所述类别的特定资产的值配对,这些资产可能没有与每个属性配对的值。
我想要4类的所有属性,与资产135的值配对。资产135没有为属性3或4设置值,因此我希望:

| property_name | property_value     |
|:--------------|:-------------------|
| Fixture ID    | A5                 |
| Manufacturer  | Black & Decker     |
| Model #       |                    |
| Type          |                    |

我的问题是:
SELECT property.property_name, asset_property.property_value
FROM property
LEFT OUTER JOIN category_property
ON property.property_id = category_property.property_id
INNER JOIN asset_property
ON asset_property.property_id = property.property_id
WHERE category_property.category_id = 4
AND asset_property.asset_id = 135

结果数据:
| property_name | property_value     |
|:--------------|:-------------------|
| Fixture ID    | A5                 |
| Manufacturer  | Black & Decker     |

因为我的AND asset_property.asset_id = 135
这是桌子:
*星号只表示来自测试用例的行。
表:属性
| property_id | property_name |
|:-----------:|:--------------|
| 1           | Fixture ID    |*
| 2           | Manufacturer  |*
| 3           | Model #       |*
| 4           | Type          |*
| 5           | Lamp Type     |

表:资产属性
将资源与属性值配对。
| asset_id | property_id | property_value |
|:--------:|:-----------:|:---------------|
| 129      | 1           | A5             |
| 129      | 2           | Black & Decker |
| 129      | 3           | 1230-02        |
| 129      | 4           | Incandescent   |
| 135      | 1           | E6             |*
| 135      | 2           | Linden         |*
| 147      | 1           | G1             |

表:类别属性
将类别与其属性配对。
| category_id | property_id |
|:-----------:|:-----------:|
| 4           | 1           |*
| 4           | 2           |*
| 4           | 3           |*
| 4           | 4           |*
| 7           | 2           |
| 7           | 5           |

我试过所有不同的连接类型,having,group by….它不知道。如果有人知道我需要什么,我会非常感谢你的帮助!谢谢!
为了澄清,我需要返回这些结果集:
| property_name |
|:--------------|
| Fixture ID    |
| Manufacturer  |
| Model #       |
| Type          |


| property_value |
|:---------------|
| A5             |
| Black & Decker |

加入他们的行列:
| property_name | property_value |
|:--------------|:---------------|
| Fixture ID    | A5             |
| Manufacturer  | Black & Decker |
| Model #       |
| Type          |

但是由于在property_id中没有property_id4和5的记录,因此这些属性的asset_property table没有显示。
| property_name | property_value |
|:--------------|:---------------|
| Fixture ID    | A5             |
| Manufacturer  | Black & Decker |

模型#
类型
我要把它们展示出来。我希望返回类别4的所有属性名,并与资产135的任何匹配属性值配对。
所以对于水果类别,我希望返回所有属性名称(颜色、季节、味道)。Apple的颜色属性尚未设置,但我仍然希望返回所有属性类型,以便可以更改或填写它们:
| property_name | property_value |
|:--------------|:---------------|
| Color         |                |
| Season        | Fall           |
| Taste         | Tart           |

最佳答案

只需将INNER JOIN改为LEFT OUTER JOIN,并将AND asset_property.asset_id = 135WHERE子句移到ON子句:

SELECT property.property_name,
       asset_property.property_value
  FROM property
 INNER
  JOIN category_property
    ON property.property_id = category_property.property_id
  LEFT
 OUTER
  JOIN asset_property
    ON asset_property.property_id = property.property_id
   AND asset_property.asset_id = 135
 WHERE category_property.category_id = 4
;

(我还将第一个LEFT OUTER JOIN更改为INNER JOIN,因为WHERE category_property.category_id = 4将(正确地)筛选出连接失败的记录。)

关于mysql - 3表,SQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8988761/

10-10 08:43