2016-06-25 9 views
0

In meiner MySQL-Datenbank gibt es 2 Tabellen:Daten Auswahl MYSQL

Table-1: 
COMMODITY_COLUMN 
CommodityType1 
CommodityType2 
.............. 
CommodityType20 


Table-2 
RECORD_ID COMMODITY_COLUMN  VALUE DATE 
1    CommodityType6   156  15/08/96 
2    CommodityType13  56  25/12/16 
3    CommodityType5   756  15/02/05 
.    CommodityType4   584 
.    CommodityType13  48 
.    CommodityType2   78 
.    CommodityType2   8 
.    CommodityType6   55 
.    CommodityType14  7 
.    CommodityType4   88 
.    .......................... 
128   CommodityType5   756  19/04/72 
129   CommodityType2   999  25/04/85 

Tabelle 1 Spalte "COMMODITY_COLUMN" als Fremdschlüssel in der Tabelle 2 verwendet. Was ich versuche zu tun, ist LAST-Werte von jedem 20 CommodityTypes aus der Tabelle-2 zu sammeln.

Ich habe verschiedenen MYSQL Ausdrücke tryied wie:

SELECT TABLE-2.VALUE FROM TABLE-2 WHERE COMMODITY_COLUMN IN (SELECT COMMODITY_COLUMN FROM TABLE-1) ORDER BY RECORD_ID DESC LIMIT 1 

Aber ich bin nicht gelungen. Ich kann 20 verschiedene Ausdrücke für jede 20 Warencodes erstellen, aber ich denke nicht, dass es eine gute Art der Programmierung ist.

Kann jemand bitte eine Lösung vorschlagen?

Antwort

1
SELECT 
    t2.RECORD_ID, 
    t2.COMMODITY_COLUMN, 
    t2.VALUE, 
    t2.`DATE` 
FROM 
    `TABLE-2` t2 
    JOIN (SELECT 
      MAX(RECORD_ID) AS RECORD_ID 
      FROM 
      `TABLE-2` 
      GROUP BY 
      COMMODITY_COLUMN) AS tt2 ON t2.RECORD_ID = tt2.RECORD_ID 

die Abfrage Gegeben Sie versucht, nahm ich an RECORD_ID ist die Auto erhöht Primärschlüssel, und das durch „letzte“ Sie für diese Ware eingefügt letzte Reihe gemeint.

Nur um zu erklären, was los ist: die SELECT Anweisung innerhalb der JOIN bekommt den letzten/max RECORD_ID für jeden COMMODITY_COLUMN. Dann wird diese "Tabelle" tt2 mit t2 auf RECORD_ID verbunden, um nur diese Zeilen von t2 zu erhalten.

+0

Ihre Antwort/Lösung funktioniert perfekt auf meiner Datenbank !!! Tha ... ky ... du! – Rat2good

+0

@ Rat2good ausgezeichnet, ich bin froh, ich könnte helfen! Sie sollten es auch als Antwort markieren. –

2

Eine Methode ist eine korrelierte Unterabfrage:

SELECT t2.* 
FROM TABLE2 t2 
WHERE t2.record_id = (SELECT MAX(tt2.record_id) 
         FROM table2 tt2 
         WHERE tt2.COMMODITY_COLUMN = t2.COMMODITY_COLUMN 
        ) ; 

Ich glaube nicht table1 etwas mit der Abfrage zu tun hat.

+0

Tha ... k y ... u @Gordon Linoff, aber ich bekomme töricht Nachricht, wenn Sie Ausdruck in meine Datenbank anwenden: 'MySQL gab eine leere Ergebnismenge (dh null Zeilen)' – Rat2good

+0

Ich bin neue SQL, könnte bitte rate ich gues "t2" und "tt2" sind Aliase? Gibt es am Ende des Ausdrucks einen Tippfehler: '... t2.COMMODITY_COLUMNFROM);' Soll es am Ende dieses Ausdrucks stehen? – Rat2good

+0

@ Rat2good. . . 't2' und' tt2' sind Tabellenaliase. Es gab einen Tippfehler mit "FROM" am Ende einer der Zeilen. –

0

Wie wäre es damit:

SELECT COMMODITY_COLUMN, VALUE, MAX(DATE) 
    FROM TABLE-2 
    GROUP BY COMMODITY_COLUMN; 
+0

Diese Abfrage erhält das maximale Datum, aber es wird nicht garantiert, dass der entsprechende 'VALUE' zurückgegeben wird. Ich glaube nicht, dass SQL definiert, aus welcher Reihe der 'VALUE' in diesem Fall kommt - es könnte jeder sein. –

+0

@Unix Eins Sind Sie sich sicher? Können Sie ein Beispiel angeben (z. B. mit SQL Fiddel), in dem _value_ angegeben wird, das nicht mit _MAX (date) _? – sagivmal

+0

Ich bin mir absolut sicher - http://sqlfiddle.com/#!9/bee62c/1/0 - um weiter zu erklären, gruppieren Sie sich nach 'COMMODITY_COLUMN' und wählen Sie für jeden von 'Aggregate (max)' von' DATE' aus Sie. Die Datenbank verknüpft diesen Gesamtdatenwert nicht implizit mit einer bestimmten Zeile, aus der andere Spaltenwerte ausgewählt werden. Wenn Sie die Zeile identifizieren möchten, aus der der 'MAX (DATE)' - Wert stammt, müssen Sie dies in SQL über eine Unterauswahl oder einen Join sagen, wobei auch die Möglichkeit berücksichtigt wird, dass zwei oder mehr Zeilen dieselben enthalten 'DATE'-Wert, z über 'MAX (ID)' oder irgendeine andere Regel, die Sie diesen Fall auflösen würden. –