MYSQL подсчитывает дочернюю таблицу с другими модификаторами - помогите пожалуйста! - PullRequest
1 голос
/ 22 января 2010

У меня есть база данных по покупке билетов, и я хочу собрать все заказы, которые соответствуют определенным критериям, а затем также собрать общее количество билетов, которое есть у каждого заказа, путем подсчета строк в таблице orders_tickets, которые соответствуют orderID. Если я сделаю SQL простой вызов, этот SQL работает:

SQL A:

ВЫБЕРИТЕ o. *, COUNT (ot.OrderTicketID) AS numtix
ОТ заказов о
СЛЕДУЮЩИЙ ПРИСОЕДИНЯЙТЕСЬ к orders_tickets orders o.orderID = ot.orderID
GROUP BY o.orderID
LIMIT 0, 30

И этот SQL тоже работает - это оригинальный вызов SQL со всеми данными, которые мне нужны , за исключением данных numtix:

SQL B:

ВЫБЕРИТЕ 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, пользователи u
ГДЕ 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
ЗАКАЗАТЬ по номеру p.perfdatetime LIMIT 0, 30

Но когда я пытаюсь включить SQL A в SQL B, я получаю ошибки:

SQL C: (не работает)

ВЫБРАТЬ 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, пользователи u
LEFT JOIN orders_tickets не включен o.orderID = ot.orderID
ГДЕ 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
ЗАКАЗАТЬ через p.perfdatetime ASC
GROUP BY o.orderID
LIMIT 0, 30

Это ошибка, которую я получаю:

# 1064 - у вас ошибка в синтаксисе SQL; проверьте правильность синтаксиса в руководстве, соответствующем версии вашего сервера MySQL, для использования в поле «GROUP BY o.orderID LIMIT 0, 30» в строке 12.

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

Любая помощь наиболее ценится!

1 Ответ

2 голосов
/ 22 января 2010

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 
...