2011-07-14 9 views
5

Tengo una tabla con 3 columnas:SQL Tener en columnas no en SELECT

userid mac_address count 

Las entradas para un usuario podría tener este aspecto:

57193 001122334455 42 
57193 000C6ED211E6 15 
57193 FFFFFFFFFFFF 2 

Quiero crear una vista que muestra solo aquellos MAC que se consideran "de uso común" para este usuario. Por ejemplo, quiero filtrar los MAC que se usan < 10% en comparación con la dirección MAC más utilizada para ese usuario. Además, quiero 1 fila por usuario. Esto podría lograrse fácilmente con un GROUP BY, HAVING & GROUP_CONCAT:

SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count 
FROM mactable 
GROUP BY userid 
HAVING count*10 >= MAX(count) 

Y, en efecto, el resultado es el siguiente:

57193 001122334455,000C6ED211E6 42 

Sin embargo, yo realmente no quiero el recuento de columnas en mi ver. Pero si me lo saco de la instrucción SELECT, me sale el siguiente error:

#1054 - Unknown column 'count' in 'having clause' 

¿Hay alguna manera de poder realizar esta operación sin estar obligado a tener un recuento de la columna desagradable en mi opinión? Sé que probablemente pueda hacerlo mediante consultas internas, pero me gustaría evitar hacerlo por motivos de rendimiento.

¡Su ayuda es muy apreciada!

Respuesta

7

Como HAVING se refiere explícitamente a los nombres de columna en la lista de selección, no es posible lo que quiere.
Sin embargo, puede usar su selección como subselección para seleccionar que solo devuelva las filas que desea tener.

SELECT a.userid, a.macs 
FROM 
(
    SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count 
    FROM mactable 
    GROUP BY userid 
    HAVING count*10 >= MAX(count) 
) as a 

ACTUALIZACIÓN:
Debido a una limitación de MySQL esto no es posible, aunque funciona en otros DBMS como Oracle. Una solución sería crear una vista para la subconsulta. Otra solución parece más limpio:

CREATE VIEW YOUR_VIEW (userid, macs) AS 
SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count 
FROM mactable 
GROUP BY userid 
HAVING count*10 >= MAX(count) 

Esta declarará la vista como devolver sólo las columnas userid y macs aunque la declaración que subyace SELECT vuelve más columnas que esos dos.
Aunque no estoy seguro, si el MySQL que no es DBMS admite esto o no ...

+0

No sabía que las subselecciones pudieran usarse así. Muchas gracias, ¡solo la respuesta que estaba buscando! – Rapsey

+0

Sin embargo, me encontré con lo siguiente: # 1349 - View's SELECT contiene una subconsulta en la cláusula FROM ¿Alguna idea? – Rapsey

+0

@Rapsey: No, porque nunca nos dijiste qué DBMS estás usando. –