【问题标题】:Using left join with min将左连接与 min 一起使用
【发布时间】:2015-11-17 17:36:10
【问题描述】:

我正在尝试使用左连接和日期连接两个表。

我的 SQL 查询

SELECT
    ord.`ordernumber` bestellnummer,
    his.`change_date` zahldatum
FROM
    `s_order` ord
LEFT JOIN
    `s_order_history` his ON ((ord.`id`=his.`orderID`) AND (ord.`cleared`=his.`payment_status_id`)) #AND MIN(his.`change_date`)
WHERE
    ord.`ordertime` >= \''.$dateSTART.'\' AND ord.`ordertime`  <= \''.$dateSTOP.'\'' ;

s_order

+----+---------------------+---------+-------------+
| id |     ordertime       | cleared | ordernumber |
+----+---------------------+---------+-------------+
|  1 | 2014-08-11 19:53:43 |       2 |         123 |
|  2 | 2014-08-15 18:33:34 |       2 |         125 |
+----+---------------------+---------+-------------+

s_order_history

+----+-------------------+-----------------+---------+---------------------+
| id | payment_status_id | order_status_id | orderID | orderID change_date |
+----+-------------------+-----------------+---------+---------------------+
|  1 |                 1 |               5 |       1 | 2014-08-11 20:53:43 |
|  2 |                 2 |               5 |       1 | 2014-08-11 22:53:43 |
|  3 |                 2 |               7 |       1 | 2014-08-12 19:53:43 |
|  4 |                 1 |               5 |       2 | 2014-08-15 18:33:34 |
|  5 |                 1 |               6 |       2 | 2014-08-16 18:33:34 |
|  6 |                 2 |               6 |       2 | 2014-08-17 18:33:34 |
+----+-------------------+-----------------+---------+---------------------+

想要的结果:

+-------------+---------------------+
| ordernumber |     change_date     |
+-------------+---------------------+
|         123 | 2014-08-11 22:53:43 |
|         125 | 2014-08-17 18:33:34 |
+-------------+---------------------+

我遇到的问题是仅获取日期,其中 clear/payment_status_id 值已在 s_order 中更改。我目前得到 payment_status_id 与当前清除值匹配的所有日期,但我只需要它首先发生的那个。

这只是实际查询的摘录,因为原始查询要长得多(主要是更多的左连接和更多的表)。

【问题讨论】:

  • 你想要这个:SELECT a.ordernumber,b.change_date FROM s_order a,s_order_history b WHERE (a.id = b.order_ID) AND (a.cleared = b.payment_status_id)我没有得到你想要的 MIN() 函数吗?

标签: mysql sql left-join min


【解决方案1】:

MIN 是一个聚合函数,因此您不能像上面尝试的那样直接在 JOIN 中使用它。您也没有将其与 JOIN 中的值进行比较。

你会想做这样的事情:

his.`change_date` = (SELECT MIN(his.`change_date`) FROM s_order_history where ord.`id` = his.`orderID`)

在你的JOIN

【讨论】:

    【解决方案2】:

    试试这个:

    select s_order.ordernumber, min(s_order_history.change_date)
    from s_order left join s_order_history
    on s_order.id = s_order_history.orderID
       and s_order.cleared = s_order_history.payment_status_id
    group by s_order.order_id
    

    【讨论】:

      【解决方案3】:
      SELECT ord.`ordernumber` bestellnummer,
      MIN( his.`change_date` ) zahldatum
      ...
      GROUP BY ord.`ordernumber`
      

      【讨论】:

        【解决方案4】:

        您可以通过ordernumber对数据进行分组

        SELECT
            ord.`ordernumber` bestellnummer,
            MIN(his.`min_change_date`) as zahldatum
        FROM
            `s_order` ord
        LEFT JOIN
            `s_order_history` his ON ((ord.`id`=his.`orderID`) AND (ord.`cleared`=his.`payment_status_id`)) #AND MIN(his.`change_date`)
        WHERE
            ord.`ordertime` >= \''.$dateSTART.'\' AND ord.`ordertime`  <= \''.$dateSTOP.'\''
        GROUP BY 
            ord.`ordernumber`;
        

        或者您可以在子查询中对数据进行分组:

        SELECT
            ord.`ordernumber` bestellnummer,
            his.`min_change_date` zahldatum
        FROM
            `s_order` ord
        LEFT JOIN (
            SELECT
               orderID, payment_status_id, MIN(change_date) as min_change_date
            FROM
                s_order_history
            GROUP BY
                orderID, payment_status_id
        ) his ON (ord.`id` = his.`orderID` AND ord.`cleared` = his.`payment_status_id`)
        WHERE
            ord.`ordertime` >= \''.$dateSTART.'\' AND ord.`ordertime`  <= \''.$dateSTOP.'\'';
        

        【讨论】:

        • 数据分组解决了问题,非常感谢。
        猜你喜欢
        • 1970-01-01
        • 2018-03-09
        • 2013-11-23
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 2019-05-27
        • 2019-03-08
        相关资源
        最近更新 更多