在一种情况下,返回基于特定列上的不同的结果


Return results based on distinct on certain column in one situation

我想在两种不同的情况下返回每条记录的最新(dateCreated desc)。

这可能是不可能的,但我想我会在这里伸出援手。

1) 如果记录的parentId列中有一个值,那么我想搜索具有相同parentId的所有记录,并在结果中只包括最新的记录(dateCreated-desc)。

我知道如何通过这样的查询来做到这一点:

select distinct(parentId) from table order by dateCreated desc

但我不知道如何做到这一点,同时努力解释这两种情况。

2) 如果记录不包含parentId,并且该记录的ID不在另一个记录的parentId中,则将其包含在结果中。

我知道我可以得到所有的结果,然后通过程序循环,就像这样:

for($i<0; $i<count($results); $i++)
{
   if ($results[$i]['parentId'])
   {
      $parentId = $results[$i]['parentId'];
      $parentDateCreated = $results[$i]['dateCreated'];
      for($k=0; $k<count($results); $k++)
      {
         if($results[$k]['parentId'] = $parentId)
         {
            if ( $results[$i]['dateCreated'] < $results[$k]['dateCreated'] )
            {
                $data[$parentId] = $results[$i];
            }
         }
      }
   }
}

可能效率不高,也不确定它是否有效,但我想知道我需要完成什么,我需要在parentId中有值的情况下找到最新的记录(需要将其与具有相同parentId的所有其他记录进行比较),或者如果记录不包含parentId,那么也只需将其包含在结果中即可。

我用一个基本查询创建了sql fiddle。http://sqlfiddle.com/#!9/69544/1

样本数据:

id  parentId  dateCreated
--  --------  -------------------
1   null      2016-04-10 20:00:00
2   1         2016-04-12 12:00:00
3   1         2016-04-13 10:00:00
4   null      2016-04-15 14:33:00

预期结果(我只返回我在结果中预期的ID):

3和4。

id 3,因为它找到了parentId为1,并且在id 3中找到了最新的,因为Created的日期更近。

id 4,因为它没有parentId,4也没有出现在任何其他记录的parentId列中。

使用两个查询的UNION。一个查询为每个字段不为空的parentID获取最多的dateCreated。另一个查询返回parentID为空的所有记录。

SELECT t1.*
FROM yourTable AS t1
JOIN (SELECT parentId, MAX(dateCreated) AS maxCreate
      FROM yourTable
      WHERE parentID IS NOT NULL
      GROUP BY parentID) AS t2
ON t1.parentID = t2.parentID AND t1.dateCreated = t2.maxCreate
UNION
SELECT *
FROM yourTable
WHERE parentID IS NULL
AND id NOT IN (
    select parentID 
    from yourTable
    WHERE parentId IS NOT NULL)

演示