2016-07-21 5 views
0

Ich habe zwei Tabellen. Ich möchte die letzte updated_product_id erhalten, wenn sie in der zweiten Tabelle vorhanden ist. Product_id aus der ersten Tabelle. Ich habeWie bekomme ich einen einzelnen Wert von der zweiten Tabelle, wenn Daten noch von der ersten Tabelle existieren?

id | product_id| client_id 
1 | 1   | 1 

und zweite Tabelle sr_client_products ersten Tabelle sr_client_product_updates

id | product_id| updated_product_id | client_product_id| updated_date 
1 | 1   | 2     | 1    | 2016-02-03 
2 | 2   | 4     | 1    | 2016-06-07 

** Erwartete Ausgabe: einreihige Spalte

updated_product_id = 4 as of updated_date 

und wenn die zweite Tabelle sr_client_product_updates keinen Wert hat dann

product_id = 1 from first table 
.

** Bis jetzt abfragen

SELECT 
if(ProductUpdate.updated_product_id = '', 
(select ClientProduct.product_id from sr_client_products ClientProduct where ClientProduct.client_id=1), 
ProductUpdate.updated_product_id) 
as product_id 
from sr_client_product_updates ProductUpdate where ProductUpdate.client_product_id=1 order by ProductUpdate.updated_date DESC limit 1 

Das Problem mit der obigen Abfrage ist es zeigt Daten, wenn der Wert in der zweiten Tabelle existiert sonst kehrt leer, und ich denke, das Problem ist mit dem Abfrage auch Ausgang: product_id = 4, wenn Daten vorhanden sind in Tabelle zweiten anderes product_id = 1, wenn der zweite Tisch

Edited Abfrage leer ist:

SELECT 
if(count(*) = 0, 
(select ClientProduct.product_id from sr_client_products ClientProduct where ClientProduct.client_id=1), 
ProductUpdate.updated_product_id) 
as product_id 
from sr_client_product_updates ProductUpdate 
where ProductUpdate.client_product_id=1 
order by ProductUpdate.updated_date DESC limit 0,100 

Lösung als

SELECT 
    COALESCE (
     sr_client_product_updates.updated_product_id, 
     sr_client_products.product_id 
    ) AS id 
FROM 
    sr_client_products 
LEFT JOIN (
    SELECT 
     MAX(updated_date) AS update_date, 
     client_product_id 
    FROM 
     sr_client_product_updates 
    GROUP BY 
     client_product_id 
) AS lastUpdate ON lastUpdate.client_product_id = sr_client_products.id 
LEFT JOIN sr_client_product_updates ON sr_client_product_updates.client_product_id = lastUpdate.client_product_id 
AND sr_client_product_updates.updated_date = lastUpdate.update_date where sr_client_products.id=1 
+0

Was für diese Beispieldaten Ihre erwartete Ergebnis ist? – Blank

+0

product_id = 4, wenn Daten in der zweiten Tabelle vorhanden sonst product_id = 1, wenn die zweite Tabelle leer –

+0

braucht, ist eine Klarstellung – JYoThI

Antwort

1
SELECT 
    COALESCE (
     sr_client_product_updates.updated_product_id, 
     sr_client_products.product_id 
    ) AS id 
FROM 
    sr_client_products 
LEFT JOIN (
    SELECT 
     MAX(updated_date) AS update_date, 
     client_product_id 
    FROM 
     sr_client_product_updates 
    GROUP BY 
     client_product_id 
) AS lastUpdate ON lastUpdate.client_product_id = sr_client_products.client_product_id 
LEFT JOIN sr_client_product_updates ON sr_client_product_updates.client_product_id = lastUpdate.client_product_id 
AND sr_client_product_updates.updated_date = lastUpdate.update_date 

die aktualisierte product_id zurück, wenn man entsprechend der tatsächlichen product_id ist. Wenn keine aktualisierte ID vorhanden ist, wird die Produkt-ID zurückgegeben.

Obwohl ich nicht sicher bin, welche Spalten Sie für den Join verwenden müssen, wäre product_id die offensichtliche Wahl, aber Ihr Beispiel macht es ein bisschen komisch. Daher müssen Sie möglicherweise die Klausel ON beheben.

Fiddle for example data

Fiddle for empty second table

+0

LINKS JOIN sr_client_product_updates ON sr_client_product_updates.client_product_id = sr_client_products.id sollte dies sein. und um limit zu verwenden, muss ich eine select-Anweisung anstelle von sr_client_product_updates.client_product_id hinzufügen. Es gibt keine Beziehung mit product_Id der Tabellen, –

+0

Okay, ich denke, ich habe es verstanden. Ich habe nicht bemerkt, dass beide Einträge in der zweiten Tabelle zur selben Zeile in der ersten Tabelle gehören. Diese Abfrage erhält die zuletzt aktualisierte ID oder die ursprüngliche ID, wenn keine Aktualisierungen vorhanden waren – Philipp

+0

Es gibt mehrere Spalten zurück und funktioniert nicht, wenn zweite Tabellendaten leer sind. –

0

Nicht sicher VON @Philipp gegeben, was Ihnen wirklich tun wollen, aber versuchen Sie dies:

select coalesce(t2.updated_product_id, t1.product_id) as product_id 
from sr_client_product_updates t1 
left join sr_client_products t2 
on t1.client_product_id = t2.client_id 
where t1.client_product_id = 1 
+0

können Sie fragen, was ist das funtion tut „verschmelzen“ – Cherif

+0

Diese wird nicht funktionieren, wenn die zweite Tabelle leer –

+0

@Charif ist [ 'coalesce'] (https://www.google.com.tw/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjm2MDHgYTOAhUBk5QKHaWzChcQFggcMAA&url=http%3A%2F%2Fwww.w3resource.com % 2Fmysql% 2Fcomparison-functions-and-operators% 2Fcoalesce-function.php & usg = AFQjCNGu1CuFT46SRnF3i6RQh_UMYbefSg & sig2 = bf56zrECoYCMgB88UTO9Hg) – Blank

0

das Problem in der if-Anweisung Sie Abfrage nicht zurück ' 'Wenn der Wert nicht beendet wird, geben Sie ein leeres Ergebnis zurück, also verwenden Sie count (*) es gibt immer einen Wert zurück, auch wenn das Ergebnis leer ist

SELECT 
    if(count(*) = 0, 
    (select ClientProduct.product_id from sr_client_products ClientProduct where ClientProduct.client_id=1), 
    ProductUpdate.updated_product_id) as product_id 
FROM 
    sr_client_product_updates ProductUpdate 
WHERE 
    ProductUpdate.client_product_id = 1 
ORDER BY 
    ProductUpdate.updated_date DESC limit 1 
+0

Es gibt immer die erste Zeilengrenze zurück und die Reihenfolge funktioniert nicht von der Abfrage. –

+0

was sollte es zurückgeben? – Cherif

+0

product_id = 4 wenn Daten in der zweiten Tabelle vorhanden sind else product_id = 1 wenn die zweite Tabelle leer ist. Ihre Abfrage funktioniert, aber das einzige Problem besteht darin, dass die erste Zeile und die Klausel where clause by und limit nicht funktionieren. –

0

Ich glaube, Sie brauchen eine einfache innere Verknüpfung

SELECT sr_client_product_updates.updated_product_id 
FROM sr_client_products 
INNER JOIN sr_client_product_updates on 
     sr_client_product_updates.updated_product_id = sr_client_products.product_id; 
+0

Dies funktioniert nicht, da Ihr Code zwei Tabellen verbindet. –

+0

Der Join für die product_id funktioniert, wenn beide Tabellen die selbe product_id enthalten. Dies wird durch Ihre Erklärung erklärt – scaisEdge

+0

Entschuldigung. Ich habe meine Frage jetzt bearbeitet. –

Verwandte Themen