2010-01-22 4 views
1

나는 티켓 구매 데이터베이스를 가지고 있으며 특정 기준을 만족하는 모든 주문을 수집하고 orderID와 일치하는 'orders_tickets'테이블의 행을 계산하여 각 주문의 총 티켓 수를 계산합니다.다른 수식어가있는 MYSQL 계산 하위 테이블 - 도와주세요!

SQL의 A : : 나는 SQL에게 간단한 전화를 걸 경우,이 SQL 작동

SELECT o . * , COUNT(ot.OrderTicketID) AS numtix
FROM orders o
LEFT JOIN orders_tickets ot ON o.orderID = ot.orderID
GROUP BY o.orderID
LIMIT 0 , 30

그리고이 SQL도 작동합니다 -이 numtix 제외하고 내가 을 원하는 모든 데이터를 원래의 SQL 호출입니다 데이터 :

SQL의 B :

SELECT o.*,
IF(o.orderedbyID = '0', ob.fname, u.fname) AS obfname,
IF(o.orderedbyID = '0', ob.lname, u.lname) AS oblname
FROM orders o, perfs p, orders_orderedby ob, users u
WHERE p.eventID = '2'
AND p.perfID = o.perfID
AND ((UNIX_TIMESTAMP(p.perfdatetime) - UNIX_TIMESTAMP(NOW())) > 0)
AND ob.orderID = o.orderID
AND u.userID = o.orderedbyID
ORDER BY p.perfdatetime ASC
LIMIT 0, 30

하지만 SQL의 B에 SQL A를 통합하려고 할 때, 나는 오류를 얻을 :

,

SQL C는 :

SELECT o.*, COUNT(ot.OrderTicketID) AS numtix,
IF(o.orderedbyID = '0', ob.fname, u.fname) AS obfname,
IF(o.orderedbyID = '0', ob.lname, u.lname) AS oblname
FROM orders o, perfs p, orders_orderedby ob, users u
LEFT JOIN orders_tickets ot ON o.orderID = ot.orderID
WHERE p.eventID = '2'
AND p.perfID = o.perfID
AND ((UNIX_TIMESTAMP(p.perfdatetime) - UNIX_TIMESTAMP(NOW())) > 0)
AND ob.orderID = o.orderID
AND u.userID = o.orderedbyID
ORDER BY p.perfdatetime ASC
GROUP BY o.orderID
LIMIT 0, 30

이것은 내가 오류입니다 (작동하지 않습니다) :

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY o.orderID LIMIT 0, 30' at line 12

내 본능은 "BY GROUP은"왼쪽에 가입하지를 적용 할 필요가 있다는 것입니다 전체 SQL,하지만 그것은 단순한 추측입니다.

모든 도움을 주시면 감사하겠습니다.

답변

2

ORDER BYGROUP BY 후 간다 :

GROUP BY o.orderID 
ORDER BY p.perfdatetime ASC 
LIMIT 0, 30 

업데이트 : 당신의 응답을

SELECT o.*, 
     COUNT(ot.OrderTicketID) AS numtix, 
     IF(o.orderedbyID = '0', ob.fname, u.fname) AS obfname, 
     IF(o.orderedbyID = '0', ob.lname, u.lname) AS oblname 
FROM orders o 
JOIN perfs p 
ON  p.perfID = o.perfID 
JOIN orders_orderedby ob 
ON  ob.orderID = o.orderID 
JOIN users u 
ON  u.userID = o.orderedbyID 
LEFT JOIN 
     orders_tickets ot 
ON  ot.orderID = o.orderID 
WHERE p.eventID = '2' 
     AND p.perfdatetime < NOW() 
GROUP BY 
     o.orderID 
ORDER BY 
     p.perfdatetime ASC 
LIMIT 0, 30 
+0

감사합니다. 그러나 변경하면 다음과 같은 오류가 발생합니다. # 1054 - 'on clause'의 'o.orderID'알 수 없음 –

+0

'@Mark S' : 명시 적 및 암시 적 조인이 혼합되어 있기 때문입니다. 잠깐, 나는 대답을 업데이트 할 것이다. – Quassnoi

+0

와우 - 완벽하게 작동합니다. 정말 고맙습니다! –