2016-05-31 5 views
0

Ich arbeite an einem php/mysql Mindesthaltbarkeitsdatum und bei der Erstellung eines neuen Schecks brauche ich das System, um ein Mindesthaltbarkeitsdatum für ein bestimmtes Produkt zu finden kürzlich geschlossenen CheckSQL Get max ID gruppiert nach einer zweiten ID

ich mit ein paar Tischen arbeite dieses erhalten getan:

bbcheckProducts  
ID checkID productID checked bestBefore 
1  1   1  1 2015-05-06 
2  2   1  1 2016-07-22 
3  3   1  1 2016-09-16 

bbChecks 
checkID userID closed 
     1  1  1 
     2  2  1 
     3  1  1 

Also, wenn ich diese Abfrage auf die Tabellen im Bild oben ausgeführt:

SELECT ID, 
     MAX(checkID) AS maxCheck, 
     bestBefore 
FROM bbcheckProducts 
WHERE checkID IN 
(
    SELECT checkID 
    FROM bbChecks 
    WHERE userID = 1 
    AND  closed = 1 
) 
AND  checked = 1 
GROUP BY productID 
ORDER BY bestbefore ASC 

es gibt etwas l ike dies:

ID = 1 
maxCheck = 3 
bestBefore = 2015-05-06 

so dass es die maximale checkID nehmen, aber die anderen Werte bleiben gleich das erste Auftreten von ProduktID. Ich will es die Werte zu übernehmen, die mit diesem max ID gehen zusammen so das Ergebnis würde wie folgt aussehen:

ID=3 
maxCheck = 3 
bestBefore = 2016-09-16 

so wie bekomme ich meine Frage, wie das funktioniert?

HINWEIS: Es gibt mehrere Produkte, so dass Produkt eins im Scheck 1 und 3 sein kann, während Produkt 2 nur in 1 ist, also die Daten von Produkt 2 von Scheck 1 und die Daten von Produkt 1 von Scheck 3

nehmen müssen
+2

Die allgemeine GROUP BY-Regel lautet: Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte angeben oder das Argument einer set-Funktion sein. – jarlh

+1

Der Datensatz ist nicht umfangreich genug, um das Problem korrekt darzustellen. – Strawberry

Antwort

0

Sie müssen wie diese Abfrage max-Funktion auf der zweiten Tabelle verwenden

select * from table_name where some_colomn = 'some_value' and some_colomn in (select max(some_colomn) from table_name2 where some_col = 'some_value' group by some_colomn)

+0

warum Sie abwählen – dev

-1

Sie Ihre Tabellen beitreten könnte eine reduzierte Menge aller Rekord mit einem check_ID in Ihrem bbChecks -table bestehende zu erhalten. Dann können Sie Ihre max(CheckID) -Auswahl auf dem reduzierten Satz ausführen.

In Ihrem Fall wäre dies so mag:

SELECT ID, max(checkID), bestBefore 
FROM bbcheckProducts p 
INNER JOIN bbChecks c ON (p.checkID = c.checkID) 
WHERE UserID = 1 
AND closed = 1 
AND checked = 1 

Damit kehren Sie zunächst alle die Datensätze mit den checkIDs 1 und 3. Und dann wählen Sie die max (checkID), so dass es Sie gibt den checkID 3.

+0

Das würde funktionieren, wenn es nur ein Produkt gäbe, mein schlechtes für das Vergessen dieses Bit der Info. Ich brauche die Abfrage, um die maximale checkID für jedes Produkt zu nehmen – steffansk1997