2012-01-24 96 views
3

我正在尝试编写一个从3个表中拉出来的SQL查询,并且无法实现我需要的结果。我想返回与特定类别配对的所有属性名称(标签),并将这些属性与来自该类别中特定资产的值配对,该值可能没有与每个属性配对的值。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  | 

这是因为我的缺失2属性AND asset_property.asset_id = 135

H是表: *星号仅表示测试用例中的行。

表:财产

| property_id | property_name | 
|:-----------:|:--------------| 
| 1   | Fixture ID |* 
| 2   | Manufacturer |* 
| 3   | Model #  |* 
| 4   | Type   |* 
| 5   | Lamp Type  | 

表: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    | 

表:category_property
对类别与它的属性。

| category_id | property_id | 
|:-----------:|:-----------:| 
| 4   | 1   |* 
| 4   | 2   |* 
| 4   | 3   |* 
| 4   | 4   |* 
| 7   | 2   | 
| 7   | 5   | 

我试过所有不同的JOIN类型,HAVING,GROUP BY ....找不到它。如果有人明白我需要什么,我会非常感激帮助!谢谢!


为了澄清,我需要回到这些套的成绩:在property_id

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

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

加入他们的行列:

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

但由于没有记录4和5在asset_property table中,这些属性的property_name没有显示。

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

型号
类型

我希望他们到E所示。我要全部类别4的产权名称将被退回并与资产135的任何匹配property_values配对。


所以对于水果类我希望所有的属性名称返回(颜色,季节,味道)。颜色属性苹果没有确定,但我还是想返回所有的属性类型,因此它们可以被改变或填写:

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

你想要的结果是远离标准化表的一个支点。如果可以的话,考虑规范化你的模式,这使得查询更简单。这个模式看起来像Magento对我来说,你无法控制,但如果它是自定义的,你可以节省一些工作。 –

回答

5

只要改变INNER JOINLEFT 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 JOININNER JOIN,因为WHERE category_property.category_id = 4会(正确地)过滤掉其中加入失败的记录,反正)

+0

如果我向asset_property添加了一行并且保留了asset_id * NULL *,** OR **语句开始了,但是我需要* ALL *来自'WHERE category_property.category_id = 4'的匹配项,并且从' assed_id = 135',但不限制它们。 –

+0

@flackend:有趣!在Oracle中,我提到的两个选项都是可用的选项(我测试过),但事实证明,在MySQL(以及PostgreSQL,可能还有其他DMBS)中,只有其中一个有效。我编辑了我的答案,删除了在MySQL中不起作用的选项。对于那个很抱歉! – ruakh

+0

你摇滚!非常感谢!! –