我想在两种不同的情况下返回每条记录的最新(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小提琴。 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中找到了最新的一个,因为dateCreated是更新的。
id 4,因为它没有parentId,也没有4出现在任何其他记录的parentId列中。
答案 0 :(得分:1)
使用UNION
两个查询。对于每个dateCreated
,一个查询获得的parentID
最多,其中该字段不为空。另一个查询返回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)