2017-10-06 74 views
0

以下是情況。我需要連接訂單表和消息表。但我只對第一條消息感興趣(最低的消息ID)。表格之間的連接是orderid。SQL - GROUP BY - HAVING - MISSING ROWS

 $result = $this->db->executeS(' 
     SELECT o.*, c.iso_code AS currency, s.name AS shippingMethod, m.message AS note 
     FROM '._DB_PREFIX_.'orders o 
     LEFT JOIN '._DB_PREFIX_.'currency c ON c.id_currency = o.id_currency 
     LEFT JOIN '._DB_PREFIX_.'message m ON m.id_order = o.id_order 
     LEFT JOIN '._DB_PREFIX_.'carrier s ON s.id_carrier = o.id_carrier 
     LEFT JOIN jtl_connector_link l ON o.id_order = l.endpointId AND l.type = 4 
     WHERE l.hostId IS NULL AND o.date_add BETWEEN DATE_SUB(NOW(), INTERVAL 1 WEEK) AND NOW() 
     GROUP BY o.id_order 
     HAVING MIN(m.id_message) 
     LIMIT '.$limit 
    ); 

此查詢適用於目前爲止。但是現在沒有消息的訂單缺失。

謝謝你的幫助! Markus

+0

您在'HAVING'中沒有做任何比較,所以最好將其刪除 –

+0

謝謝。我想我誤解了HAVING min(m.id_message)爲「只返回具有最小messageid的行」。 – mysecondworld

+0

跳過GROUP BY和HAVING子句,改爲執行'ORDER BY m.id_message LIMIT 1'。 – jarlh

回答

0

您想要選擇幾個訂單並且每次訂購第一條消息。在缺少窗口函數的情況下,這在MySQL中通常很困難(例如ROW_NUMBER OVER)。但是因爲它只是您感興趣的消息表中的一列,所以可以在SELECT子句中使用子查詢。

SELECT 
    o.*, 
    c.iso_code AS currency, 
    s.name AS shippingMethod, 
    (
    SELECT m.message 
    FROM message m 
    WHERE m.id_order = o.id_order 
    ORDER BY m.id_message 
    LIMIT 1 
) AS note 
FROM orders o 
JOIN currency c ON c.id_currency = o.id_currency 
JOIN carrier s ON s.id_carrier = o.id_carrier 
WHERE o.date_add BETWEEN DATE_SUB(NOW(), INTERVAL 1 WEEK) AND NOW() 
AND NOT EXISTS 
(
    SELECT * 
    FROM jtl_connector_link l 
    WHERE l.endpointId = o.id_order 
    AND l.type = 4 
); 
+0

謝謝你的解決方案。學到了很多! <3 – mysecondworld