stored ejemplos delete declarar mysql sql mysql-error-1111

ejemplos - variables en mysql select



MySQL: uso no válido de la función de grupo (2)

En primer lugar, el error que está obteniendo se debe a que está utilizando la función COUNT : no puede usar una función agregada (o grupal) en la cláusula WHERE .

Segundo, en lugar de usar una subconsulta, simplemente únase a la tabla:

SELECT a.pid FROM Catalog as a LEFT JOIN Catalog as b USING( pid ) WHERE a.sid != b.sid GROUP BY a.pid

Que creo que debería devolver solo las filas donde existen al menos dos filas con el mismo pid pero hay al menos 2 sid s. Para asegurarse de obtener solo una fila por pid , he aplicado una cláusula de agrupamiento.

Estoy usando MySQL. Aquí está mi esquema:

Proveedores ( sid: entero , nombre: cadena, cadena de direcciones)

Partes ( pid: entero , pname: cadena, color: cadena)

Catálogo ( sid: entero, pid: entero , costo: real)

(las teclas principales están en negrita)

Estoy tratando de escribir una consulta para seleccionar todas las partes que están hechas por al menos dos proveedores:

-- Find the pids of parts supplied by at least two different suppliers. SELECT c1.pid -- select the pid FROM Catalog AS c1 -- from the Catalog table WHERE c1.pid IN ( -- where that pid is in the set: SELECT c2.pid -- of pids FROM Catalog AS c2 -- from catalog WHERE c2.pid = c1.pid AND COUNT(c2.sid) >= 2 -- where there are at least two corresponding sids );

En primer lugar, ¿estoy yendo sobre esto de la manera correcta?

En segundo lugar, obtengo este error:

1111 - Uso no válido de la función de grupo

¿Qué estoy haciendo mal?


Necesita usar HAVING, no DONDE.

La diferencia es: la cláusula WHERE filtra qué filas selecciona MySQL. Entonces MySQL agrupa las filas y agrega los números para su función COUNT.

HAVING es como WHERE, solo sucede después de que se haya calculado el valor de COUNT, por lo que funcionará como se espera. Reescribe tu subconsulta como:

( -- where that pid is in the set: SELECT c2.pid -- of pids FROM Catalog AS c2 -- from catalog WHERE c2.pid = c1.pid HAVING COUNT(c2.sid) >= 2)