Подсчет дочерней таблицы MYSQL с другими модификаторами - помогите пожалуйста!

У меня есть база данных для покупки билетов, и я хочу собрать все заказы, соответствующие определенным критериям, а затем также получить общее количество билетов для каждого заказа, подсчитав строки в таблице «orders_tickets», которые соответствуют идентификатору заказа. Если я сделаю SQL простым вызовом, этот 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 тоже работает — это исходный вызов SQL со всеми данными, которые мне нужны, кроме данных numtix:

SQL Б:

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 A в SQL B, я получаю ошибки:

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

Мне кажется, что «GROUP BY» нужно применять к LEFT JOIN, а не ко всему SQL, но это чистое предположение.

Любая помощь приветствуется!


person Mark S    schedule 22.01.2010    source источник


Ответы (1)


ORDER BY идет за GROUP 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 
person Quassnoi    schedule 22.01.2010
comment
Спасибо за ваш ответ. Но когда я делаю это изменение, я получаю эту ошибку: # 1054 - Неизвестный столбец «o.orderID» в «предложении on» - person Mark S; 22.01.2010
comment
@Mark S: это потому, что вы смешиваете явные и неявные соединения. Минутку, я обновлю ответ. - person Quassnoi; 22.01.2010