例如,我有一个车间订单数据库,里面有两个表 - 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。
编辑:基本目标是我想显示订单的最新状态。
答案 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。您可能需要按一下查询。