2016-08-04 29 views
0

我想在兩種不同情況下返回每條記錄的最新(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,並且由於dateCreated更近,所以找到id 3中最近的一個。

id 4,因爲它沒有parentId,也沒有4出現在任何其他記錄的parentId列中。

+1

你的第一個查詢將無法工作。樣本數據和期望的結果將真正幫助解釋您想要完成的任務。 –

+0

你的小提琴不是很有幫助,因爲你沒有多個記錄具有相同的parentID – Barmar

回答

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) 

DEMO

+0

我修改了小提琴http://sqlfiddle.com/#!9/b348a/3我添加了另一個記錄到表中並修改了你的上面的查詢將包含recipientId = 1,在該小提琴中,查詢返回ids:3,1,5。我期望它僅返回3和5,因爲id 3的parentId爲1,因爲這是更新的(dateCreated更高)然後返回,而不是id 1和id 5,因爲它有一個recipientId = 1並且沒有parentId,所以它不需要查看是否有另外一個id更新,就像id 3一樣。感謝您提供反饋對我的問題。 – Brad

+0

'id = 1'沒有'parentId',所以它會被返回。 – Barmar

+0

更新的小提琴仍然沒有兩行具有相同的'parentId'。 – Barmar

相關問題