SQL - GROUB BY - HAVING - MISSING ROWS

时间:2017-10-06 12:46:52

标签: mysql sql

以下是这种情况。我需要将订单表与消息表连接起来。但我只对第一条消息感兴趣(最低消息ID)。表之间的连接是orderid。

        $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
    );

此查询到目前为止有效。但是现在没有消息的订单丢失了。

感谢您的帮助! 马库斯

1 个答案:

答案 0 :(得分:0)

您想要选择多个订单并按订单输入第一条消息。由于缺少窗口函数(例如ROW_NUMBER OVER),这在MySQL中通常很难。但由于它只是您感兴趣的消息表中的一列,因此您可以在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
);