情况如下。我需要将订单表与消息表连接起来。但我只对第一条消息(最低的消息 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
);
此查询到目前为止有效。但现在没有消息的订单不见了。
感谢您的帮助! 马库斯
最佳答案
您想要选择多个订单并为每个订单选择第一条消息。这在 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
);
关于mysql - SQL - 分组依据 - 具有 - 缺失行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46606115/