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