2016-09-02 2 views
0

Hoffe, dass jemand helfen kann.kombiniert zwei Select-Anweisungen mit GROUP und JOIN mysql

Ich habe zwei mysql Select-Anweisungen, die jeweils funktionieren, aber ich muss sie jetzt kombinieren.

Erstens:

SELECT $shares.*, $shares_company.name AS name, SUM($shares.number) AS totalNumber, MAX(date) AS lastTransDate, $shares.timestamp AS lastUpdated FROM $shares 
INNER JOIN 
$shares_company WHERE $shares_company.id = $shares.company_id GROUP BY $shares.company_id 

Zweitens:

SELECT $shares.price AS lastPrice 
FROM $shares WHERE ($shares.company_id,$shares.date) IN 
(SELECT $shares.company_id, MAX($shares.date) FROM $shares GROUP BY $shares.company_id) 

versuchte ich UNION und UNION ALL, und alle möglichen anderen Kombinationen.

Ich stecke fest!

enter image description here

UPDATE:

Nun, das ist, wie weit ich jetzt habe. Dies gibt alle korrekten Informationen zurück, mit der Ausnahme, dass ich die Summe der Spalte "Zahl" abrufen muss und ich nicht weiß, wo ich sie in die Abfrage einfügen soll. Die Abfrage einzufügen ist:

SELECT 
SUM($shares.number) AS totalNumber FROM $shares 
GROUP BY $shares.company_id 

Die Abfrage Ich habe jetzt ist:

SELECT $shares.price AS lastPrice, 
$shares.date AS lastTransDate, 
$shares.company_id, 
$shares.id, 
$shares.timestamp AS lastUpdated, 
$shares_company.name 
FROM $shares 

INNER JOIN $shares_company 
ON $shares_company.id = $shares.company_id 

WHERE ($shares.company_id,$shares.date) IN 
(SELECT $shares.company_id, MAX($shares.date) 
FROM $shares 
GROUP BY $shares.company_id) 

Vielen Dank für all die Hilfe.

+0

Sie können Union nicht verwenden, wenn die Feldnummer unterschiedlich ist. Versuchen Sie, linker Join zu verwenden. –

+0

Ich lege 'LINKE VERBINDUNG' zwischen die beiden Aussagen, aber keine Freude. –

Antwort

0

Wenn ich richtig verstehe, möchten Sie das lastPrice-Ergebnis innerhalb der ersten Abfrage. In diesem Fall würde ich so etwas wie dies versuche:

SELECT 
    $shares.*, 
    $shares_company.name AS name, 
    SUM($shares.number) AS totalNumber, 
    MAX(date) AS lastTransDate, 
    $shares.timestamp AS lastUpdated FROM $shares, 
    (SELECT $s.price 
    FROM $shares AS $s 
    WHERE $s.company_id = $shares.company_id 
    ORDER BY $s.date DESC 
    LIMIT 1 
) AS lastPrice 
    INNER JOIN $shares_company 
    ON $shares_company.id = $shares.company_id 
GROUP BY $shares.company_id 

(Anmerkung: Dies ist nicht getestet, aber die Argumentation sollte klar sein: Erstellen Sie eine innere Abfrage den letzten Aktienkurs für diese bestimmte Zeile zu wählen, dann Rückkehr es als eine andere Spalte).

+0

Vielen Dank für Ihren Erfolg, funktioniert aber nicht ganz. Ich habe einige Änderungen an Ihrer Anfrage vorgenommen, aber immer noch kein Glück. Der 'lastPrice', der zurückgegeben wird, ist das erste Ergebnis, nicht wie es sein sollte, das Ergebnis, das sich auf die Zeile mit dem letzten 'lastUpdated' bezieht. Hoffe, das macht Sinn. –

+0

Funktioniert es, wenn Sie $ s.date zu $ ​​s.lastUpdated in meiner Abfrage ändern? – Tom

+0

Tut mir leid, funktioniert nicht. Wenn ich Ihre Abfrage ändere, erhalte ich die korrekten Ergebnisse mit Ausnahme des zuletzt bezahlten Preises. SELECT Aktien $. *, $ shares_company.name AS name, SUM ($ shares.number) AS TOTALNUMBER, MAX (Datum) AS lastTransDate, $ shares.company_id, $ shares.price AS lastPrice, $ shares.timestamp AS Lastupdated FROM $ Aktien, (SELECT $ shares.price FROM $ Aktien WHERE $ shares.id = $ shares.company_id ORDER BY $ shares.date DESC LIMIT 1 ) AS Test INNER JOIN $ shares_company WO $ shares_company.id = $ shares.company_id GROUP BY $ -Aktien.company_id –