2016-08-04 6 views
0

Ich möchte den letzten (dateCreated desc) jedes Datensatzes in zwei verschiedenen Situationen zurückgeben.Gibt Ergebnisse basierend auf distinct für bestimmte Spalte in einer Situation zurück

Dies ist vielleicht nicht einmal möglich, aber ich dachte, ich würde hier weitermachen.

1) Wenn der Datensatz einen Wert in der parentId -Spalte hat, dann möchte ich durch alle Datensätze mit derselben parentId suchen und nur die letzte (dateCreated desc) in die Ergebnisse aufnehmen.

Ich weiß, wie die w/eine Abfrage wie dies zu tun:

select distinct(parentId) from table order by dateCreated desc 

Aber ich weiß nicht, wie das zu erreichen, während versuchen, für beiden Situationen zu berücksichtigen.

2) Wenn der Datensatz keine parentId enthält und die ID dieses Datensatzes nicht in der parentId eines anderen Datensatzes enthalten ist, dann fügen Sie diese in das Ergebnis ein.

Ich weiß, dass ich alle Ergebnisse bekommen konnte, dann programmatisch Schleife durch sie etwa so:

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]; 
      } 
     } 
     } 
    } 
} 

Wahrscheinlich nicht effizient und nicht sicher, ob es funktioniert, aber ich wollte eine Vorstellung davon geben, was ich brauche, zu erreichen , Muss ich die neuesten Datensätze für den Fall finden, dass es einen Wert in der ParentId (die es mit allen anderen Datensätzen mit der gleichen ParentId verglichen werden muss) oder wenn der Datensatz keine ParentId enthält, dann nur enthalten im Ergebnis auch.

Ich erstellte SQL Fiddle mit einer grundlegenden Abfrage. http://sqlfiddle.com/#!9/69544/1

Beispieldaten:

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 

Erwartete Ergebnisse (Ich werde nur die ids kehre ich im Ergebnis erwarten):

3 und 4.

id 3, weil es gefunden Eine parentId von 1 und die letzte in ID 3 gefunden, weil das dateCreated aktueller war.

ID 4, weil es keine ParentId hatte und auch nicht 4 in der ParentId-Spalte eines anderen Datensatzes angezeigt wurde.

+1

Ihre erste Abfrage wird nicht funktionieren. Beispieldaten und gewünschte Ergebnisse würden wirklich helfen zu erklären, was Sie erreichen möchten. –

+0

Ihre Geige ist nicht sehr hilfreich, da Sie nicht mehrere Datensätze mit der gleichen ParentID haben – Barmar

Antwort

1

Verwenden Sie eine UNION von zwei Abfragen. Eine Abfrage erhält die meisten dateCreated für jede parentID, wo dieses Feld nicht null ist. Die andere Abfrage gibt alle Datensätze zurück, in denen parentID null ist.

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

Ich änderte die Geige http://sqlfiddle.com/#!9/b348a/3 Ich fügte einen weiteren Datensatz in die Tabelle und modifizierte Ihre Abfrage oben, um recipientId = 1, in dieser Giddle, gibt Ihre Abfrage IDs: 3, 1, 5. Ich erwarte es nur 3 und 5, weil ID 3 hat eine parentId von 1, da das ist neuer (dateCreated ist höher) Dann gib das anstelle von ID 1 und ID 5 zurück, weil es eine recipientId = 1 und keine parentId hat, also muss es nicht schauen, ob es eine andere ID gibt, die neuer ist als im Fall von ID 3. Danke für die Rückmeldung zu meiner Frage. – Brad

+0

'id = 1' hat keine' parentId', daher wird sie zurückgegeben. – Barmar

+0

Die aktualisierte Geige hat immer noch nicht zwei Zeilen mit der gleichen 'parentId'. – Barmar

Verwandte Themen