php - 在一种情况下根据特定列的不同返回结果

标签 php mysql sql group-by distinct

我想在两种不同的情况下返回每条记录的最新(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,因为它找到了 1 的 ParentId,并在 id 3 中找到了最新的一个,因为 dateCreated 较新。

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

最佳答案

使用两个查询的UNION。对于每个 parentID(其中该字段不为空),一个查询会获取最多的 dateCreated。另一个查询返回 parentID 为 null 的所有记录。

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)

DEMO

关于php - 在一种情况下根据特定列的不同返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38777943/

相关文章:

PHP 在变量名中使用变量

php - MYSql 查询性能

mysql - 人为地向 MySQL 结果添加记录

MySQL - 显示给定财政年度的每月所有金额

php - 如何制作按钮以删除mysql字段中的值?

与 Not IN 上的语法错误有关的 Mysql 问题

mysql - ON Duplicate Key 用于多个值的精确组合

mysql - 如何对没有特定格式的数字和字母的 varchar 进行排序?

sql - 如何在存储过程的选择中插入记录作为休息时间

php - SQL 关闭运算符