Mysql 3表,SQL查询

Mysql 3表,SQL查询,mysql,sql,Mysql,Sql,我正在尝试编写一个SQL查询,它从3个表中提取数据,但未能获得所需的结果。我希望返回与特定类别配对的所有属性名称(标签),并将这些属性与所述类别中特定资产的值配对,该类别可能没有与每个属性配对的值 我希望类别4的所有属性与资产135的值配对。资产135没有为属性3或4设置值,因此我希望: | property_name | property_value | |:--------------|:-------------------| | Fixture ID | A5

我正在尝试编写一个SQL查询,它从3个表中提取数据,但未能获得所需的结果。我希望返回与特定类别配对的所有属性名称(标签),并将这些属性与所述类别中特定资产的值配对,该类别可能没有与每个属性配对的值

我希望类别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     |  
由于my
和asset\u property,它缺少两个属性。asset\u 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           |  
我已经尝试了所有不同的连接类型,有,分组方式…无法理解。如果有人知道我需要什么,我会非常感谢你的帮助!谢谢


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

| property_name |  
|:--------------|  
| Fixture ID    |  
| Manufacturer  |  
| Model #       |  
| Type          |  

并在
属性\u id
上加入他们:

| property_name | property_value |  
|:--------------|:---------------|  
| Fixture ID    | A5             |  
| Manufacturer  | Black & Decker |  
| Model #       |  
| Type          |  
但是,由于在
资产属性表中没有
属性id
4和5的记录,因此这些属性的
属性名称
不会显示

| property_name | property_value |  
|:--------------|:---------------|  
| Fixture ID    | A5             |  
| Manufacturer  | Black & Decker |  
型号#
类型

我想让他们看看。我希望返回类别4的所有属性名称,并与资产135的任何匹配属性值配对


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

| property_name | property_value |  
|:--------------|:---------------|  
| Color         |                |  
| Season        | Fall           |  
| Taste         | Tart           |  

只需将
内部联接
更改为
左侧外部联接
,并将
和asset_property.asset_id=135
WHERE
子句移动到
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
;

(我还将第一个
左侧外部联接
更改为
内部联接
,因为
WHERE category_属性.category_id=4
将(正确地)过滤掉联接失败的记录。)

如果我在asset_属性中添加了一行,并将asset_id保留为空,则OR语句生效,但是我需要来自
的所有匹配项,其中category\u property.category\u id=4
,并填写来自
assed\u id=135
的结果,但不限制它们。@flackend:有趣!在Oracle中,我提到的两个选项都是有效的(我测试过),但在MySQL(和PostgreSQL,可能还有其他DMBSE)中,只有一个有效。我已经编辑了我的答案,删除了在MySQL中不起作用的选项。对不起!您想要的结果是一个轴心远离规范化表。如果可以的话,考虑规范化模式,这样查询变得简单多了。这个模式在我看来就像Magento的,您无法控制它,但如果它是自定义的,您可以为自己节省一些工作。
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
;