2012-04-16 12 views
9

Estoy tratando de obtener algunas consultas escritas para cierta integridad en dos tablas. La consulta es algo como esto¿Cómo uso WHERE en Columna calculada?

SELECT if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) AS order_item_total, 
SUM(oi.quantity * oi.price) AS item_total 
FROM orders o 
INNER JOIN order_items oi ON oi.order_id = o.id 
WHERE order_item_total != item_total 
GROUP BY o.id 

He usado definitivamente alias a tales columnas en el pasado así que no estoy seguro de por qué en este caso me está diciendo order_item_total no es una columna.

+0

duplicado de http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces-an-error [de los documentos del mySQL] (http : //dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html): SQL estándar no permite referencias a alias de columna en una cláusula WHERE. Esta restricción se impone porque cuando se evalúa la cláusula WHERE, es posible que el valor de la columna aún no se haya determinado. – xQbert

+0

Intenta reemplazar 'WHERE' con' HAVING', eso debería arreglarlo. – halfer

+0

@xQbert Usted está en lo correcto, pero la respuesta no es tan buena como la aquí, en lo que concierne a esta consulta específica. Es gracioso que nunca lo haya intentado antes, pensé que sí. Pero aparentemente solo estaba en ORDER BY y TENIENDO las cláusulas –

Respuesta

8

Uso tener en columnas agregadas.

SELECT if(o.is_discounted != 1, o.item_cost, o.discounted_item_cost) order_item_total, 
    SUM(oi.quantity * oi.price) item_total 
FROM orders o 
INNER JOIN order_items oi ON oi.order_id = o.id 
GROUP BY o.id 
HAVING order_item_total != item_total 
+0

cerrar teniendo y agrupar por estar al revés. – xQbert

+0

Sí. Esta es la mejor solución –

4

intente envolver todo en otra consulta SELECT.

SELECT * 
FROM 
(
    SELECT if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) AS order_item_total, 
    SUM(oi.quantity * oi.price) AS item_total 
    FROM orders o 
    INNER JOIN order_items oi ON oi.order_id = o.id 
    GROUP BY o.id 
) x 
WHERE X.order_item_total != X.item_total 
+2

. Esta funciona realmente de forma automática pero esperando marcar como respuesta para ver si hay una sin subconsulta "falsa". –

+0

@DaveStein Probablemente haya mejores formas de hacerlo. Esta es una forma rápida y sucia para hacer el trabajo – Taryn

4

WHERE viene antes SELECT al manipular los datos. por lo que necesita WHERE if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) != SUM(oi.quantity * oi.price)

La otra manera de manejar esto es usar una sub consulta

SELECT 
    .. 
FROM 
    (//your query here 
    ) t 
//now you can use your aliases 
WHERE t.order_item_total != t.item_total 

Aquí la tiene:

SELECT if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) AS order_item_total, 
SUM(oi.quantity * oi.price) AS item_total 
FROM orders o 
INNER JOIN order_items oi ON oi.order_id = o.id 
WHERE 1 
GROUP BY o.id 
HAVING order_item_total != item_total 
+0

Lo había intentado antes y luego me dijo "Uso inválido de la función de grupo" –

+1

@DaveStein - Acabo de notar que estás usando una cláusula GROUP BY, solo cambia el DONDE a una declaración HAVING y debería funcionar para usted. – JonH

+0

'donde X! = Suma()'? ¿Está usted seguro de eso? –

Cuestiones relacionadas