2010-06-15 38 views
8

En mi db, tengo una tabla de "ventas" y un "sales_item". A veces, algo sale mal y la venta se registra, pero no las ventas.
Así que estoy tratando de obtener el ID de ventas de mi tabla "ventas" que no tienen filas en la tabla sales_item.mysql select where count = 0

Aquí está la consulta mysql pensé que funcionaría, pero no es así:

SELECT s.* 
FROM sales s NATURAL JOIN sales_item si 
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%' 
AND s.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%' 
HAVING count(si.sales_item_id) = 0; 

¿Alguna idea?

Respuesta

14

¿De dónde viene el alias de la tabla v? Mostrando la definición de la tabla sería una muy buena idea;)

Tiene que ser una combinación izquierda:

SELECT * 
FROM table1 
LEFT JOIN table2 ON(table1.id = table2.table1_id) 
WHERE table2.table1_id IS NULL 

Tabla 1 es su ventas-Mesa y tabla2 es que sales_item

+0

hola tobias, el v alias era un error tipográfico, lo corregí. Gracias por su respuesta, funciona perfectamente. CU alrededor – OSdave

4

No es necesario unir las tablas, se puede usar algo como:

[...] WHERE sales.id NOT IN (SELECT sales_id FROM sales_item) 

estos Filtros sólo las ventas que no tiene ninguna entrada en sales_item correspondientes.

+1

No utilizaría "NO ENCENDIDO" debido a problemas de rendimiento. La solución de unión a la izquierda proporcionada por Tobias es mucho mejor. – ceteras

+0

Creo que lo usará para depuración temporal, pero su punto es perfectamente válido :) –

0

Suponiendo que cada el elemento en sales_item tiene un sales_id asociado en su contra, probablemente esté buscando todas las ventas que no tienen artículos.

¿Qué le parece usar una subconsulta? Obtener todos los sales_ids de la tabla de ventas, donde el id no existe en la tabla de artículos ...

SELECT * from sales where sales_id not in (SELECT DISTINCT sales_id from sales_item) 

(nota: la sintaxis exacta puede ser malo, pero la idea debe estar en buen estado, si he entendido bien la pregunta)

4

utilizaron siempre con Agrupar por

GROUP BY si.sales_item_id 
HAVING count(si.sales_item_id) = 0; 
0

La unión es restringir las filas que se mostrarán. Mi consejo es olvidarse de la unión y usar en su lugar algo como esto:

seleccione * de ventas donde salesId no en (seleccione salesId de sales_item)

Básicamente, las devoluciones de ventas que no tiene ningún asociado sales_item.

Buena suerte

0

probablemente debería grupo filas por artículo de venta ID.

SELECT s.id, count(*) as no_of_items 
FROM sales s NATURAL JOIN sales_item si 
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%' 
    AND v.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%' 
GROUP BY si.salesitem_id 
HAVING no_of_items = 0; 
1

Para completar ....

SELECT S.* 
FROM SALES S 
WHERE NOT EXISTS (
    SELECT 1 
    FROM SALES_ITEM SI 
    WHERE SI.SALES_ITEM_ID = S.ID) 

MySQL puede tener problemas con las cláusulas.