使用GROUP BY连接两个SQL表无法实现所需的结果

时间:2009-12-23 05:04:29

标签: sql mysql sorting join

例如,我有一个车间订单数据库,里面有两个表 - ORDERS和ORDERSTATUS。

Table : orders
--------------------------------------------
OrderID | OrderItems | AddedTimeStamp      |
--------------------------------------------
1       | Apples     | 2009-12-22 13:15:18 |
--------------------------------------------
2       | Bananas    | 2009-12-22 14:15:24 |
--------------------------------------------

Table : orderstatus
--------------------------------------------------------------------
StatusID | OrderID | Status   | AssignedUser | StatusTimestamp     |
--------------------------------------------------------------------
1        | 1       | Received | JohnSmith    | 2009-12-22 14:15:24 |
--------------------------------------------------------------------
2        | 2       | Received | MaryJane     | 2009-12-22 14:15:24 |
--------------------------------------------------------------------
3        | 1       | Process  | JohnSmith    | 2009-12-22 14:15:24 |
--------------------------------------------------------------------
4        | 2       | Process  | MaryJane     | 2009-12-22 14:15:24 |
--------------------------------------------------------------------
5        | 2       | Deliver  | MaryJane     | 2009-12-22 14:15:24 |
--------------------------------------------------------------------

我正在运行此SQL查询:

SELECT od.orderid, od.orderitems, os.status, os.assigneduser
FROM orders AS od INNER JOIN orderstatus AS os
ON od.orderid = os.orderid
GROUP BY os.orderid
ORDER BY os.orderid ASC

这让我回报:

------------------------------------------------
OrderID | OrderItems | Status   | AssignedUser |
------------------------------------------------
1       | Apples     | Received | JohnSmith    |
------------------------------------------------
2       | Bananas    | Received | MaryJane     |
------------------------------------------------

我想要的是:

------------------------------------------------
OrderID | OrderItems | Status   | AssignedUser |
------------------------------------------------
1       | Apples     | Process  | JohnSmith    |
------------------------------------------------
2       | Bananas    | Deliver  | MaryJane     |
------------------------------------------------

我对MySQL查询很新,但过去4个小时我一直在敲我的头 - 有人可以帮忙吗? TIA。

编辑:基本目标是我想显示订单的最新状态。

3 个答案:

答案 0 :(得分:3)

如果没有更多信息,很难得到你想要的东西。 orderstatus表中的所有记录都具有相同的时间戳。您似乎只想要具有其他状态的那些,但没有任何方法可以区分不同的状态。

为了做到这一点,我们需要告诉MySQL如何选择最佳行。仔细看看......你怎么知道你是一台机器,哪一排要返回?

我能想到的最好的是你想要最新的orderstatus记录(max statusid)。如果是这种情况,那么这是一个可以工作的脚本:

SELECT
    od.orderid, 
    od.orderitems, 
    os.status, 
    os.assigneduser
FROM orders AS od
INNER JOIN orderstatus AS os ON od.orderid = os.orderid
INNER JOIN (
    SELECT
        MAX(StatusID) AS StatusID,
        OrderId
    FROM orderstatus
    GROUP BY OrderId
) as maxos ON maxos.StatusID = os.StatusID
GROUP BY os.orderid
ORDER BY os.orderid ASC

我假设您的示例不准确,并且时间戳在现实生活中实际上会有所不同。

在这种情况下,您可以使用上面的相同脚本,但获取max(时间戳)而不是max(statusid)。

您可以做的另一件事是规范化状态列(为状态代码创建一个表,并添加一个指定顺序的列。然后您可以使用上面的脚本获取max(新订单列)。

答案 1 :(得分:3)

使用:

   SELECT o.orderid,
          o.orderitems,
          os.status,
          os.assigneduser
     FROM ORDERS o
LEFT JOIN ORDERSTATUS os ON os.orderid = o.orderid
     JOIN (SELECT os.orderid,
                  MAX(os.statustimestamp) 'm_statustimestamp'
             FROM ORDERSTATUS os
         GROUP BY os.orderid) x ON x.orderid = o.orderid
                               AND x.m_statustimestamp = os.status_timestamp

我使用时间戳作为查找最新记录的方式,尽管您的数据声称它们都是相同的。

如果您将ORDERSTATUS.status列标准化为单独的表格(例如ORDER_STATUS_CODE,有两列 - 代码和说明),那么您可以更轻松地使用基于整数的键,您可以使用MAX()或MIN(),具体取决于列的设置方式,以获得给定订单的最高状态。

答案 2 :(得分:0)

看起来您需要知道每个订单的最新状态和用户。加入,组和顺序不起作用。您可以通过多种方式实现该结果,并且子查询是一种。试试这个:

SELECT od.orderid, od.orderitems, 
(SELECT os.status FROM os.orderstatus AS os WHERE os.orderid = od.orderid ORDER BY os.StatusTimestamp LIMIT 1) AS status, 
(SELECT os.assigneduser FROM os.orderstatus AS os WHERE os.orderid = od.orderid ORDER BY os.StatusTimestamp LIMIT 1) AS assigneduser, 
FROM orders AS od 

尽管如此,带上一粒盐。我不知道你正在运行哪个版本的MySql,我比Sql Server更熟悉MySql。您可能需要按一下查询。