MySQL оператор, который объединяет подзапрос и JOIN не работает - PullRequest
1 голос
/ 02 августа 2011
SELECT i.id AS id, i.modify_date as modify_date, s.subscription as subscriptionid, p.paid/i.total AS paidratio 
    FROM invoices i,
         (SELECT p.invoice, sum(amount) AS paid FROM payments p GROUP BY p.invoice) p
        LEFT JOIN sub_to_inv s 
            ON i.id=s.invoice
    WHERE p.invoice=i.id 
        AND i.corporation='3' 
        AND i.payer=1

Ошибка, которую я получаю, это «неизвестный столбец на i.id», который является полностью поддельным - invoices (i) наверняка имеет строку id. Они все делают.

Цель подзапроса - выяснить, сколько было оплачено счета. Например, для счета со столбцом «итого» 1000,00 может быть 2 или 3 раздельных платежа. В конечном итоге я хочу перечислить все неоплаченные счета или частично счета в первую очередь. Но прежде чем я доберусь до стадии ORDER BY, мне нужно выяснить эту ошибку.

Ответы [ 3 ]

1 голос
/ 02 августа 2011

Использовать синтаксис JOIN для всех объединений.Не смешивайте синтаксис JOIN с синтаксисом SQL-89 в стиле запятых.

SELECT ...
FROM invoices i
  INNER JOIN (SELECT...) p
    ON p.invoice=i.id
  LEFT OUTER JOIN sub_to_inv s 
    ON i.id=s.invoice
WHERE 
    AND i.corporation='3' 
    AND i.payer=1

Объяснение: JOIN имеет более высокий приоритет, чем объединения через запятую.Таким образом, p JOIN s оценивается до того, как запрос оценивает соединение с i.Поэтому в предложении ON i.id=s.invoice таблица i еще не известна и является недопустимой ссылкой.

См. http://dev.mysql.com/doc/refman/5.1/en/join.html, в документе, следующем за «Присоединение к обработке изменений в MySQL 5.0.12».».

0 голосов
/ 02 августа 2011

Я думаю, что вы можете столкнуться с проблемами из-за порядка соединений вашей таблицы в вашем SQL. Вы пытались использовать внутреннее соединение. Возможно попробуйте:

SELECT 
  i.id AS id, 
  i.modify_date as modify_date, 
  s.subscription as subscriptionid, 
  p.paid/i.total AS paidratio 
FROM
  invoices i
INNER JOIN
  (SELECT 
    p.invoice,
    sum(amount) AS paid
  FROM
    payments p
  GROUP BY
    p.invoice) p
ON
  p.invoice=i.id
LEFT JOIN
  sub_to_inv s
ON
  i.id=s.invoice
WHERE
  i.corporation='3' AND i.payer=1
0 голосов
/ 02 августа 2011

Можете ли вы попробовать это?

SELECT i.id AS id, i.modify_date as modify_date, s.subscription as subscriptionid, p.paid/i.total AS paidratio 
    FROM invoices i
        LEFT JOIN
          (SELECT p.invoice, sum(amount) AS paid FROM payments p GROUP BY p.invoice) p
          ON p.invoice=i.id 
        LEFT JOIN sub_to_inv s 
            ON i.id=s.invoice
    WHERE  i.corporation='3' 
        AND i.payer=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...