mysql - SQL - 分组依据 - 具有 - 缺失行

标签 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
    );

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

感谢您的帮助! 马库斯

最佳答案

您想要选择多个订单并为每个订单选择第一条消息。这在 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/

相关文章:

MySQL 将行转为动态数量的列

php - 在 Web 应用程序(LAMP 堆栈)中保护数据库 (MySQL) 登录凭据

php - 当我在动态站点中的同一类别下添加产品时,仅显示第一个产品

SQL like 日期子句

sql - Oracle SQL Sum 缺少右括号

mysql select 查询优化以及 limit 在 mysql 中的工作原理

php - MYSQL 数学运算优先级

php - 我怎样才能使这个 mysqli 查询在 PHP 中运行得更快?

mysql - 如何在 MYSQL 中删除 2 行中的 1 行?

mysql - 如何在 Visual Basic 中连接两个或多个数据库?