我试图编写一个从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_id
4和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 = 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
;
(我还将第一个
LEFT OUTER JOIN
更改为INNER JOIN
,因为WHERE category_property.category_id = 4
将(正确地)筛选出连接失败的记录。)关于mysql - 3表,SQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8988761/