2016-06-06 20 views
2

Ich habe 2 Tabellen, die Status-Tabelle mit Profil-Tabelle verbunden sind. Die eindeutige tagId und die Statustabelle des Profiltabellenspeichers speichern mehrere doppelte tagid-Einträge. Ich möchte die Gruppe nach Tagids letztem Datensatz und dem ersten Datensatz zeigen.Mysql Query Group nach letzten Datensatz und ersten Datensatz

Tabelle: Hinweis Profil: TagId ist einzigartig

-------------------------------------------------------------------- 
| tagId(PK) | blah2 | blah3 | blah4 | 
-------------------------------------------------------------------- 
101   | 
102   | 
103   | 
104   | 
105   | 
106   | 

Tabelle: Status

-------------------------------------------------------------------- 
statusId | tagId | date  | height| weight | statusType | blah2 | 
-------------------------------------------------------------------- 
1  | 101 | 2010-01-01 | 5.6 | 300 | single  | 
2  | 102 | 2010-01-01 | 5.7 | 300 | single  | 
3  | 101 | 2015-01-01 | 5.6 | 310 | married | 
4  | 103 | 2010-01-01 | 5.6 | 300 | single  | 
5  | 104 | 2010-01-01 | 5.6 | 300 | single  | 
6  | 101 | 2016-01-01 | 5.6 | 300 | pregnant | 
7  | 101 | 2016-09-01 | 5.6 | 300 | delivery | 
8  | 105 | 2010-01-01 | 5.6 | 300 | single  | 

Was ich zuerst Datum und Gruppe von im letzten Statustype

Ergebnis der Abfrage, um zu versuchen Gruppe wollen wird sein:

-------------------------------------------------------------------- 
| tagId | date  | height| weight | statusType | blah2 | 
-------------------------------------------------------------------- 
| 101 | 2010-01-01 | 5.6 | 300 | delivery | 
| 102 | 2010-01-01 | 5.7 | 300 | single  | 
| 103 | 2010-01-01 | 5.6 | 300 | single  | 
| 104 | 2010-01-01 | 5.6 | 300 | single  | 
| 105 | 2010-01-01 | 5.6 | 300 | single  | 

Aber ich kann nicht mit ihm Erfolg, habe ich versucht, mit diesem MySQL-Code

SELECT DISTINCT Profile.TagId,Status.date,Status.StatusType,Status.height,Status.weight FROM Profile 
LEFT JOIN Status ON Status.TagId = Profile.TagId 
Where Status.StatusId In(Select Max(Status.StatusId) From Status Group By  Status.TagId) 
Group By Status.TagId ORDER BY Profile.TagId ASC, Status.TagId DESC 

Aber es gibt letztes Datum und die letzte Statustype, wie dieses

Abfrage Ergebnis:

-------------------------------------------------------------------- 
| tagId | date  | height| weight | statusType | blah2 | 
-------------------------------------------------------------------- 
| 101 | 2016-09-01 | 5.6 | 300 | delivery | 
| 102 | 2010-01-01 | 5.7 | 300 | single  | 
| 103 | 2010-01-01 | 5.6 | 300 | single  | 
| 104 | 2010-01-01 | 5.6 | 300 | single  | 
| 105 | 2010-01-01 | 5.6 | 300 | single  | 
+0

Was ist "Höhe" und "Gewicht"? – Blank

+0

Höhe vergessen, Gewicht @Reno –

+0

Ich verstehe es einfach nicht, aber vielleicht war es leichter zu verstehen, bevor – Strawberry

Antwort

1

I Ich glaube, Sie suchen wahrscheinlich nach etwas in der Art:

SELECT DISTINCT p.tagId, 
       smin.`date`, smin.height, smin.weight, 
       smax.StatusType 
FROM Profile AS p 
LEFT JOIN (
    SELECT tagId, MAX(`date`) AS max_date, MIN(`date`) AS min_date 
    FROM Status 
    GROUP BY tagId 
) AS s ON p.tagId = s.tagId 
LEFT JOIN Status AS smin ON smin.tagId = p.tagId AND s.min_date = smin.`date` 
LEFT JOIN Status AS smax ON smax.tagId = p.tagId AND s.max_date = smax.`date` 

Die Abfrage verwendet eine abgeleitete Tabelle, die minimale und maximale date Werte pro tagId zurückgibt. Mit diesen Werten können wir zurück zu Status Tisch sitzt und date, height und weight Werte aus dem Status Datensatz erhalten die den maximalendate Wert Mindestdate Wert undStatusType Wert für die Status Datensatz mit.

1

nicht sicher, ob Sie dies wünschen oder nicht, aber es einfach versuchen und hoffen, dass ich Fehler melden Ihre Frage nicht;)

SQL Fiddle

MySQL 5.6-Setup:

CREATE TABLE status 
    (`statusId` int, `tagId` int, `date` date, `height` int, `weight` int, `statusType` varchar(8)) 
; 

INSERT INTO status 
    (`statusId`, `tagId`, `date`, `height`, `weight`, `statusType`) 
VALUES 
    (1, 101, '2010-01-01', 5.6, 300, 'single'), 
    (2, 102, '2010-01-01', 5.7, 300, 'single'), 
    (3, 101, '2015-01-01', 5.6, 310, 'married'), 
    (4, 103, '2010-01-01', 5.6, 300, 'single'), 
    (5, 104, '2010-01-01', 5.6, 300, 'single'), 
    (6, 101, '2016-01-01', 5.6, 300, 'pregnant'), 
    (7, 101, '2016-09-01', 5.6, 300, 'delivery'), 
    (8, 105, '2010-01-01', 5.6, 300, 'single') 
; 

Anfrage 1:

Results:

| tagId |  date | statusType | 
|-------|------------|------------| 
| 101 | 2010-01-01 | delivery | 
| 102 | 2010-01-01 |  single | 
| 103 | 2010-01-01 |  single | 
| 104 | 2010-01-01 |  single | 
| 105 | 2010-01-01 |  single | 

Subquery f ist der erste Eintrag, der von jeder Gruppe und l ist der letzte Eintrag, der von jeder Gruppe, und wenn Sie möchten height oder weight Spalte, benutzen Sie bitte einen von ihnen wählen, welche Sie bevorzugen zu.

Auch können Sie diese alle Abfrage profile dann left join Sie tagId = 106, aber dieser Datensatz Sie date und statusTypenull für Spalte geben bekommen.

Verwandte Themen