3表,SQL查询

jar*_*ack 3 mysql sql

我正在尝试编写一个从3个表中提取的SQL查询,但无法实现我需要的结果.我想返回与特定类别配对的所有属性名称(标签),并将这些属性与来自所述类别的特定资产的值配对,这些值可能没有与每个属性配对的值.

我想要类别4的所有属性,与资产135的值配对.资产135没有为属性3或4设置的值,所以我想要:

| property_name | property_value     |  
|:--------------|:-------------------|  
| Fixture ID    | A5                 |  
| Manufacturer  | Black & Decker     |  
| Model #       |                    |  
| Type          |                    |
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

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
Run Code Online (Sandbox Code Playgroud)

结果数据:

| property_name | property_value     |  
|:--------------|:-------------------|  
| Fixture ID    | A5                 |  
| Manufacturer  | Black & Decker     |  
Run Code Online (Sandbox Code Playgroud)

由于我的原因,它缺少了2个属性 AND asset_property.asset_id = 135

以下是表格:*星号表示测试用例中的行.

表:财产

| property_id | property_name |  
|:-----------:|:--------------|  
| 1           | Fixture ID    |*  
| 2           | Manufacturer  |*  
| 3           | Model #       |*  
| 4           | Type          |*  
| 5           | Lamp Type     |  
Run Code Online (Sandbox Code Playgroud)

table:asset_property
将资产与属性值配对.

| 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             |  
Run Code Online (Sandbox Code Playgroud)

table:category_property
将类别与其属性配对.

| category_id | property_id |  
|:-----------:|:-----------:|  
| 4           | 1           |*  
| 4           | 2           |*  
| 4           | 3           |*  
| 4           | 4           |*  
| 7           | 2           |  
| 7           | 5           |  
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有不同的JOIN类型,HAVING,GROUP BY ......无法弄明白.如果有人理解我的需要,我真的很感激帮助!谢谢!


为了澄清,我需要返回以下结果集:

| property_name |  
|:--------------|  
| Fixture ID    |  
| Manufacturer  |  
| Model #       |  
| Type          |  
Run Code Online (Sandbox Code Playgroud)

| property_value |  
|:---------------|  
| A5             |  
| Black & Decker |  
Run Code Online (Sandbox Code Playgroud)

加入他们property_id:

| property_name | property_value |  
|:--------------|:---------------|  
| Fixture ID    | A5             |  
| Manufacturer  | Black & Decker |  
| Model #       |  
| Type          |  
Run Code Online (Sandbox Code Playgroud)

但是,由于不存在用于记录property_id在图4和5 asset_property table中,property_name对于那些性质未示出.

| property_name | property_value |  
|:--------------|:---------------|  
| Fixture ID    | A5             |  
| Manufacturer  | Black & Decker |  
Run Code Online (Sandbox Code Playgroud)

型号
#Type

我希望他们能够展示出来.我希望返回类别4的所有属性名称,并与资产135的任何匹配的property_values配对.


因此,对于水果类别,我想要返回所有属性名称(颜色,季节,味道).Apple的color属性未设置,但我仍然希望返回所有属性类型,因此可以更改或填写它们:

| property_name | property_value |  
|:--------------|:---------------|  
| Color         |                |  
| Season        | Fall           |  
| Taste         | Tart           |  
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 5

只需INNER JOIN将a 更改为a 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
;
Run Code Online (Sandbox Code Playgroud)

(我还将第LEFT OUTER JOIN一个更改为a INNER JOIN,因为WHERE category_property.category_id = 4意志(正确)过滤掉了连接失败的记录.无论如何.)