MySQL:当子项符合条件时选择父项

MySQL:当子项符合条件时选择父项,mysql,join,parent,subquery,Mysql,Join,Parent,Subquery,我有以下情况 表“parent”具有父对象: +-----+-------------------+ | UID | some_parent_stuff | +-----+-------------------+ | 1 | value01 | +-----+-------------------+ | 2 | value02 | | | | 表子对象具有指向父对象的引用列和状态: +-----+---

我有以下情况

表“parent”具有父对象:

+-----+-------------------+
| UID | some_parent_stuff |
+-----+-------------------+
|  1  | value01           |
+-----+-------------------+
|  2  | value02           |
|     |                   |
表子对象具有指向父对象的引用列和状态:

+-----+-------------+------------+
| UID | parent_uid  | status_uid |
+-----+-------------+------------+
|  1  | 2           | 1          |
+-----+-------------+------------+
|  2  | 2           | 5          |
+-----+-------------+------------+
|  3  | 1           | 2          |
|     |             |            |
现在我想选择所有的父母,其中UID最高的孩子在列表中有一个状态UID(即在(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子句中。所以我不想选择它

我希望你能理解我的问题,我的英语不是最好的。。。谢谢您的建议,并致以最诚挚的问候

克尤泽


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

我认为您需要的是查询中的查询(在我的示例中是PreQuery)。内部查询以每个父id为基础,即最大子级uid,而不考虑符合条件的状态id。由于这是按父项分组的,因此它将为每个示例数据返回两条记录

Child Table
UID   Parent   Status
2     2        5
3     1        2
现在,您可以通过此预查询在各自ID上连接到父表和子表,并在第二个子级连接处,将状态条件添加到(1,5)


这将仅返回子ID 2、父ID 2、状态5的1记录。由于子ID 3的状态为2,因此它不会在最终结果集中返回。

谢谢您的回答。这将我推向正确的方向。但我把它简化得太多了。。。如果子表有一列“crdate”(timestamp),该怎么办?该列必须是最高值。我无法比较MAX(crdate)的值,因为在某些情况下它不是唯一的。@Kjuuze,那么您所要做的就是将MAX(c.uid)更改为MAX(c.crdate),然后将PreQuery MAX date列的连接也更改为相同的MAX date。
Child Table
UID   Parent   Status
2     2        5
3     1        2
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 )