MySQL:当子匹配条件时选择父级

时间:2014-07-08 15:55:47

标签: mysql join parent subquery

我有以下情况。

表“parent”具有父对象:

+-----+-------------------+
| UID | some_parent_stuff |
+-----+-------------------+
|  1  | value01           |
+-----+-------------------+
|  2  | value02           |
|     |                   |

表子对象具有父项的引用列和状态:

+-----+-------------+------------+
| UID | parent_uid  | status_uid |
+-----+-------------+------------+
|  1  | 2           | 1          |
+-----+-------------+------------+
|  2  | 2           | 5          |
+-----+-------------+------------+
|  3  | 1           | 2          |
|     |             |            |

现在我想选择所有父母,UID最高的孩子在列表中有一个status_uid(即IN(1,5))。

我有这样的事情:

SELECT P.uid FROM parent P
INNER JOIN child C ON C.parent_uid = P.uid AND C.status_uid IN(1)
GROUP BY P.uid;

这也会返回UID为2的父级。但它有一个UID较高的孩子,其状态不在IN-Clause中。所以我不想选择它。

我希望你理解我的问题,我的英语不是最好的......感谢你的想法和最好的问候

Kjuuze

2 个答案:

答案 0 :(得分:0)

SELECT P.uid 
FROM parent P
INNER JOIN child C ON C.parent_uid = P.uid AND C.status_uid IN(1)
WHERE C.status_uid = (
SELECT MAX(status_uid) 
FROM child)
GROUP BY P.uid;

如果我理解你的要求这应该有用,但是这没有经过测试,你也可以在这里查看mysql子查询mysql

答案 1 :(得分:0)

我认为您需要的是查询中的查询(我的示例中的PreQuery)。内部查询基于每个父ID,最大子级别uid,无论合格状态ID如何。由于这是按父级分组的,因此每个示例数据将返回两条记录。

Child Table
UID   Parent   Status
2     2        5
3     1        2

现在,您可以通过相应ID上的此预先查询加入父表和子表,并在第二个CHILD-LEVEL联接中,在(1,5)

中添加状态标准
SELECT
      p.uid, 
      p.some_parent_stuff,
      c2.uid,
      c2.status_uid
   from 
      ( select c.parent_uid,
               MAX( c.uid ) as ChildUID
            from
               child c
            group by 
               c.parent_uid ) PreQuery
      JOIN Parent p
         ON PreQuery.parent_uid = p.uid
      JOIN Child c2
         ON PreQuery.ChildUID = c2.uid
        AND c2.status_id in ( 1, 5 )

这将仅返回Child ID 2,Parent 2,Status 5的1条记录。由于Child ID为3的状态为2,因此不会在最终结果集中返回。