簡體   English   中英

在一種情況下基於特定列的不同返回結果

[英]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,並且由於dateCreated是最新的,所以在id 3中找到了最新的。

id 4,因為它沒有parentId,也沒有在其他任何記錄的parentId列中顯示4。

使用兩個查詢的UNION 對於該字段不為null的每個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)

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM