2010-07-13 4 views
2

Dans la requête suivante, l'erreur Unknown column 'order.id' in 'on clause' est lancée par ma référence order.id dans INNER JOIN. La colonne id existe en effet.Portée variable dans SQL `order`.id colonne inconnue

Des idées pour lesquelles ce n'est pas accessible via la sous-requête?

SELECT 
    SUM(price+shipping_price) AS total_sales, 
    COUNT(id) AS total_orders, 
    AVG(price+shipping_price) AS order_total_average, 
    (SELECT 
      SUM(quantity) 
     FROM `order_product` 
     WHERE `order`.id = order_product.order_id 
    ) as total_units, 
    SUM(price+shipping_price)/7 as daily_average, 
    (SELECT 
      SUM(order_product.price * order_return_product.quantity) 
     FROM order_return_product 
     INNER JOIN order_product ON (
      order_product.order_id = `order`.id AND 
      order_product.product_id = order_return_product.product_id AND 
      order_product.vehicle_id = order_return_product.vehicle_id 
     ) 
     WHERE return_id IN (
      SELECT 
       id 
      FROM order_return 
      WHERE status_id != 3 AND 
      order_return.order_id = `order`.id 
     ) 
    ) as total_returns 
FROM `order` 
WHERE created >= 1278388801 AND 
created <= 1279079999 AND 
fraud = 0 AND 
type_id = 4 

Je reçois pas d'erreur quand je commente sur order .id dans le INNER JOIN

+1

Vous n'êtes pas 'incluez order' au plus profond' select', il doit être inconnu à ce moment-là, n » t-il? –

+0

C'est juste une rupture dans l'INNER JOIN, ça marche bien partout ailleurs où je l'ai utilisé. – Webnet

Répondre

0

essayez ceci:

SELECT 
    SUM(order_product.price * order_return_product.quantity) 
FROM order_return_product 
INNER JOIN order_product ON (
    order_product.product_id = order_return_product.product_id AND 
    order_product.vehicle_id = order_return_product.vehicle_id 
) 
WHERE return_id IN (
    SELECT 
     id 
    FROM order_return 
    WHERE status_id != 3 AND 
    order_return.order_id = `order`.id 
) 
AND order_product.order_id = `order`.id 

... pour les total_returns sous-requête

+0

Parfait! Bien que je me demande encore pourquoi c'était hors de portée ... – Webnet

+0

+1 pour cette question, j'aimerais savoir pourquoi aussi. – ceteras

0

Je pense que problème est parce que l'ordre est mot-clé pour mysql donc utiliser

`order`.`id ` 

OU

o.id 
    | 
    | 
    | 
    FROM `order` o 
+0

Je ne pense pas que ce soit ça - ça marchera tant que c'est entre guillemets. Mais bonne prise quand même. –

2

Le order .id est hors de la portée dans cette requête - vous êtes traitant uniquement les tables order_return_product et order_product dans la sous-requête.

+0

Mais je devrais toujours avoir accès à la requête principale que je pensais .... et si elle est hors de la portée, comment puis-je l'utiliser dans l'autre sous-requête très bien? – Webnet

+0

Vous l'utilisez dans une clause WHERE dans l'autre sous-requête, donc c'est bien. L'erreur est due au fait que vous essayez d'utiliser 'order'.'id' dans une clause ON pour une requête qui n'utilise pas' order' comme l'une de ses tables. – Mat