English 中文(简体)
根据合并优先栏的最低价值选择不同的身份行
原标题:Selecting distinct identity rows based on the lowest value of a joined priority column
  • 时间:2009-09-19 18:12:53
  •  标签:

简化表格结构、所有INT栏和在身份栏外没有PK:

<>Nos(n) table:id

<>Attributes (a) table:id,node_id,type_id

<>Type (t) table:id, priority/code>

我试图选择一组属性,每个属性最低。 优先处理有关议题。 虽然每个<代码>node_id都有多个属性, 我只想选择具有最低优先价值的国家:

a1 n1 t1 p0 *
a2 n1 t2 p1 
a3 n2 t2 p1 *
a4 n2 t3 p2  

这是我从那时起工作的基本问题,当时Im也 st:

   SELECT * 
     FROM a 
LEFT JOIN t ON a.type_id = t.id 
 GROUP BY node_id

我的第一项想法是使用一个总合的MIN,但我会遇到问题,把de子的最低优先程度与正确的属性相匹配。

最佳回答

这个问题是“异构体”问题的变式,但你重新寻找最不重要的问题,而你的标准则载于一份研究表(),而不是原则表(Attributes)。

因此,请在<代码>Attributes上浏览(a1),这样,与node_id相同的其他行文都不与较低的优先权有关。

SELECT a1.*
FROM Attributes a1 INNER JOIN Type t1 ON (a1.type_id = t1.id)
LEFT OUTER JOIN (
  (Attributes a2 INNER JOIN Type t2 ON (a2.type_id = t2.id))
  ON (a1.node_id = a2.node_id AND t1.priority > t2.priority)
WHERE a2.node_id IS NULL;

指出这可能产生联系。 如果两个参考型号被提及并具有同样优先,你会如何解决联系。 换言之,在以下例子中,应当选定哪些属性?

a1 n1 t1 p0 
a2 n1 t1 p0 
a3 n2 t2 p1 
a4 n2 t3 p1 

PS:我希望你不要忘记,我给你的问题增添了“大集团”的标签。 看到关于我同样gged笑的SO问题的其他问题。

问题回答

使用破门查询(未测试):

SELECT      n.*, a.*
FROM        Nodes n
LEFT JOIN   Attributes a
        ON  a.id = (SELECT      x.id --//TOP 1 x.id
                    FROM        Attributes x
                    INNER JOIN  Type t
                            ON  x.type_id = t.id
                    WHERE       x.node_id = n.id
                    ORDER BY    t.priority ASC,
                                --//just in case there are 2 attributes 
                                --//with the same priority, order also on x.id
                                x.id ASC
                    LIMIT 1
                    )




相关问题
热门标签