我需要帮助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
我希望这是有道理的。我感谢任何帮助和/或指导。
谢谢!
路易斯
答案 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
编辑:我误解了你并选择了最深的属性,但我应该选择深度最大的片段