涉及内连接和分组依据的SQL查询

时间:2011-12-09 14:19:11

标签: mysql sql

我需要帮助MySQL查询来优化我的Rails 3应用程序。

我有2个表:细分和自定义属性。

表格定义是:


- 姓名
- organization_id
- 祖先
- ancestry_depth

custom_properties
- 姓名
- 标签
- 价值
- segment_id

细分是树状结构,因此是祖先列。例如段3是段2的子节点是段1的子节点。每个段都具有相同的自定义属性,但是,值可以来自继承的段(树上的段)而不是段本身。如果从树中的段继承特定属性的值,则将其值设置为null。

我的目标是在单个SQL语句中检索特定段的自定义属性,同时考虑段的深度,因为深度决定了我需要的值的优先级顺序。

我当前的查询非常接近,它返回特定段的正确数量的属性,但是,使用该group by语句我总是得到ID最低的属性,但我真正需要的是属性最深的。如果我在那时取出该组,我会从“IN”中列出的每个段获得重复属性1。但同样,我只需要最高层的财产。

SELECT custom_properties.name, 
       custom_properties.value, 
       segments.ancestry_depth 
FROM   custom_properties 
       INNER JOIN segments 
         ON custom_properties.object_id = segments.id 
WHERE  custom_properties.object_type = 'Segment' 
       AND custom_properties.object_id IN ( 86770, 86637, 40667, 180 ) 
       AND custom_properties.value IS NOT NULL 
GROUP  BY custom_properties.name 
ORDER  BY custom_properties.name, 
          segments.ancestry_depth DESC 

我希望这是有道理的。我感谢任何帮助和/或指导。

谢谢!

路易斯

2 个答案:

答案 0 :(得分:0)

尝试从DESC子句中删除ORDER BY关键字。

编辑:

尝试以下方法:

SELECT v.*
FROM   (SELECT custom_properties.name, 
               custom_properties.value, 
               segments.ancestry_depth 
        FROM   custom_properties 
               INNER JOIN segments 
                 ON custom_properties.object_id = segments.id 
        WHERE  custom_properties.object_type = 'Segment' 
               AND custom_properties.object_id IN ( 86770, 86637, 40667, 180 ) 
               AND custom_properties.value IS NOT NULL 
        ORDER  BY custom_properties.name, 
                  segments.ancestry_depth DESC) v
GROUP  BY name 

答案 1 :(得分:0)

也许这会奏效:

SELECT c.name, c.VALUE, s1.ancestry_depth, s2.ancestry_depth as depth
FROM custom_properties as c
JOIN segments s1 ON c.object_id = s1.id
LEFT JOIN segments s2 ON c.object_id = s2.id AND s2.ancestry_depth > s1.ancestry_depth
WHERE  c.object_type = 'Segment' 
AND c.object_id IN ( 86770, 86637, 40667, 180 ) 
AND c.VALUE IS NOT NULL 
GROUP  BY c.name 
HAVING ISNULL(depth)
ORDER  BY c.name, s1.ancestry_depth DESC 

编辑:我误解了你并选择了最深的属性,但我应该选择深度最大的片段