2009-12-23 31 views
1

例如,我有一个车间订单数据库和两个表 - ORDERS和ORDERSTATUS。通过GROUP BY连接两个SQL表并未实现预期的结果

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。

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

+0

数据库应该如何知道Delivered> Processed> Received? – Joe 2009-12-23 05:12:20

+0

Woops抱歉,我忙于格式化表格,以至于我没有意识到我想要的标准......编辑我的问题以进一步澄清。 – scoopdreams 2009-12-23 06:25:42

回答

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(timestamp)而不是max(statusid)。

你可以做的另一件事是标准化状态栏(创建状态代码表,并添加一列指定的顺序。然后你就可以使用上面的脚本中获取最大(即新订单列)。

+0

+1:使用statusid列的呼叫良好。 – 2009-12-23 05:23:46

+0

@加布里埃尔 - 你和小马的答案都能奏效,但我把你的答案投给了你,因为你在我的问题中给出了错误的数据(时间戳),因此你试图寻找替代解决方案。 **无论如何,您都可以获得荣誉!非常感谢,现在它可以工作,我可以停止敲打我的头!** – scoopdreams 2009-12-23 06:49:43

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(),具体取决于如何设置列以获得最高状态对于给定的顺序。

+0

我会使用ORDER_STATUS_CODE表的标准化方法。 – kosoant 2009-12-23 05:16:54

+0

不,没有时间戳是不同的。 :)我在这里使用的数据是盲目复制和粘贴的。将尝试您的解决方案,谢谢! – scoopdreams 2009-12-23 06:27:26

+0

+1有一个解决方案,以及运作。谢谢,小马! – scoopdreams 2009-12-23 06:50:17

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。你可能不得不按摩一些查询。

+0

Subselects ?! * ewww *任何事情都会比那些更好。 – 2009-12-23 05:27:55

+0

Lol @ponies。 (爱处理btw。)在Sql Server中选择rock。我在你的回答中提及你我的两个免责声明中的任何一个......哈哈。 – 2009-12-23 05:46:02

+0

@Ponies:我在上面看到你的答案。尼斯。我会与它一起运行。我敢打赌,Sql Server优化器会将我的子查询示例转变为与您的答案接近的正弦函数,逻辑上没有什么区别。 – 2009-12-23 05:50:58