2009-12-23 5 views
1

예를 들어, 주문서 데이터베이스와 ORDERS 및 ORDERSTATUS 테이블이 두 개 있습니다.GROUP BY로 두 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  | 
------------------------------------------------ 

내가하고 싶은 것은 :

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 쿼리를 실행하고

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

나는 아주 새로운 해요 MySQL 쿼리에,하지만 난 내 머리를 파고있어 t 4 시간 - 누군가 도울 수 있습니까 ?? TIA.

편집 : 기본 목적은 내가 주문에 대한 최신 상태를 표시 할 수 있습니다.

+0

데이터베이스가 전달됨> 처리됨> 수신됨을 어떻게 알 수 있습니까? – Joe

+0

Woops 죄송합니다. 테이블을 포맷하는 데 너무 바빠서 내가 원하는 기준을 실현하지 못했습니다 ... 더 명확히하기 위해 제 질문을 편집했습니다. – scoopdreams

답변

3

더 힘들어서 더 자세한 정보를 얻지 못합니다. orderstatus 테이블의 모든 레코드에는 동일한 시간 소인이 있습니다. 그것은 당신이 단지 다른 상태로 사람을 원하는 것,하지만 다른 상태를 구별 할 수있는 방법이 없습니다.

이렇게하기 위해서 우리는 MySQL에게 최상의 행을 선택하는 방법을 알려줄 필요가있다. 밀접하게 봐라 ... 당신이 기계인지, 어떻게 되돌아 갈 줄 아는가?

내가 가장 추측 할 수있는 것은 최신 orderstatus 레코드 (최대 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 (statusid) 대신 max (timestamp)를 얻을 수 있습니다.

다른 방법으로 상태 열을 정규화하고 (상태 코드 테이블을 만들고 주문을 지정하는 열을 추가 한 다음 위 스크립트를 사용하여 최대 주문 수를 얻을 수 있습니다.)

+0

+1 : statusid 열을 사용하는 것이 좋습니다. –

+0

@ 가브리엘 - 당신과 조랑말의 대답은 모두 효과가 있었지만, 내 질문에 잘못된 데이터 (타임 스탬프)가 주어 졌을 때 대체 솔루션을 찾으려고 시도했기 때문에 답변으로 투표했습니다. ** 어쨌든 당신 모두에게 명성! 고마워요, 지금은 작동하고, 나는 머리를 치는 것을 그만 둘 수 있습니다! ** – scoopdreams

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 열을 정규화하는 경우 (최신 기록을 찾을 수있는 방법으로 타임 스탬프를 사용라고 말하세요., 코드와 설명의 두 열 포함)을 사용하면 정수 기반 키를 사용한다고 가정하면 열의 설정 상태에 따라 MAX() 또는 MIN()을 사용하여 가장 높은 상태를 얻을 수 있으므로 주어진 주문에 대해서.

+0

ORDER_STATUS_CODE 테이블로 정규화 된 접근법을 사용합니다. – kosoant

+0

아니요 타임 스탬프가 다릅니다. :) 여기에서 사용한 데이터는 맹목적으로 복사하여 붙여 넣습니다. 고맙습니다. – scoopdreams

+0

+1 또한 효과가있는 솔루션을 보유하고 있습니다. 고마워, 조랑말! – scoopdreams

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에 익숙합니다. 쿼리를 일부 마사지해야 할 수도 있습니다.

+0

Subselects ?! * ewww * 무엇이든지 그것들보다 잘 수행 할 것입니다. –

+0

Lol @ponies. (핸들 btw 사랑.) Subselects SQL Server에서 락. 그리고 나는 나의 대답에있는 나의 2 개의 포기의 어느 쪽이든에 당신을 ... 추천한다. –

+0

@ 포니 : 위의 답변을 참조하십시오. 좋은. 나는 그것으로 달릴 것입니다. SQL Server 최적화 도구가 내 하위 쿼리 예제를 사용자의 대답과 거의 무언가로 변환 할 것이라는 점을 기꺼이 알고 있습니다. 논리적으로는 거의 차이가 없습니다. –

관련 문제