2010-09-29 7 views
1

L'erreur exacte que je reçois est: "Unknown column 'trans_paid' dans 'où la clause'"Pourquoi ai-je une erreur "Colonne inconnue"?

Ma requête ($ from_date et $ to_date sont correctement mis en forme):

SELECT 
    o.order_id, 
    o.order_po_no, 
    o.order_ship_date, 
    acct.acct_company, 
    SUM(ROUND(i.item_qty * i.item_price, 2)) AS item_amount, (
     SELECT SUM(trans_amount) 
     FROM transactions 
     WHERE order_id = o.order_id 
     AND trans_pending =0 
     AND trans_date >= '$from_date' 
     AND trans_date <= '$to_date' 
    ) AS trans_paid 
FROM orders AS o 
    INNER JOIN accounts AS acct ON o.acct_id = acct.acct_id 
    INNER JOIN items AS i ON o.order_id = i.order_id 
    WHERE (o.order_status =7 or o.order_status = 4) 
     AND trans_paid IS NOT NULL 
     AND acct.is_wholesale =1 
     AND acct.acct_company LIKE '%".$_POST['company']."%' 
GROUP BY o.order_id 
+0

Cela n'a rien à voir avec votre question principale, mais comme une suggestion, vous devriez vraiment désinfectez votre poster des variables avant de les entrer dans votre requête. –

Répondre

3

La norme SQL ne vous permet pas de faire référence aux colonnes d'agrégation dans la clause WHERE. Vous devez déplacer la condition trans_paid vers une clause HAVING pour que cela fonctionne.

changement

WHERE (o.order_status =7 or o.order_status = 4) 
    AND trans_paid IS NOT NULL 
    AND acct.is_wholesale =1 
    AND acct.acct_company LIKE '%".$_POST['company']."%' 
GROUP BY o.order_id 

à

WHERE (o.order_status =7 or o.order_status = 4) 
    AND acct.is_wholesale =1 
    AND acct.acct_company LIKE '%".$_POST['company']."%' 
GROUP BY o.order_id 
HAVING trans_paid IS NOT NULL 
4

Vous pouvez 't référence des colonnes aliasées dans la cause SELECT à partir de la clause WHERE. Vous devrez envelopper dans une sous-requête si vous voulez filtrer dessus.

0

Un nom d'alias à utiliser dans la clause Where doit être déclaré dans la clause FROM ... Vous avez simplement renommé une colonne qui ne renomme pas réellement un objet tel qu'une table.

0

utilisez cette requête:

SELECT 
    o.order_id, 
    o.order_po_no, 
    o.order_ship_date, 
    acct.acct_company, 
    SUM(ROUND(i.item_qty * i.item_price, 2)) AS item_amount, 
    trans_paid 
    FROM orders AS o 
    LEFT JOIN 
    (SELECT SUM(trans_amount) AS trans_paid 
    FROM 
    WHERE trans_pending =0 
    AND trans_date >= '$from_date' 
    AND trans_date <= '$to_date' 
    ) temp 
    USING order_id 

    INNER JOIN accounts AS acct ON o.acct_id = acct.acct_id 
    INNER JOIN items AS i ON o.order_id = i.order_id 
    WHERE (o.order_status =7 or o.order_status = 4) 
     AND trans_paid IS NOT NULL 
     AND acct.is_wholesale =1 
     AND acct.acct_company LIKE '%".$_POST['company']."%' 
GROUP BY o.order_id