2010-03-20 14 views
18

En este momento tengo la siguiente consulta:consulta MySQL: SELECT DISTINCT column1, GROUP BY columna2

SELECT name, COUNT(name), time, price, ip, SUM(price) 
    FROM tablename 
WHERE time >= $yesterday 
    AND time <$today GROUP BY name 

Y lo que me gustaría hacer es añadir un DISTINCT por la columna 'IP', es decir

SELECT DISTINCT ip FROM tablename 

Así que mi resultado final serían todas las columnas, de todas las filas donde el tiempo es hoy, agrupadas por nombre (con el recuento de nombres para cada nombre que se repite) y sin direcciones IP duplicadas.

¿Cómo debería ser mi consulta? (o alternativamente, ¿cómo puedo agregar el filtro faltante a la salida con php)?

Gracias de antemano.


[ACTUALIZACIÓN]

para minimizar la confusión, considere esto (simplificado) de la tabla db:

| name | ip | 
--------------------- 
| mark | 123 | 
| mark | 123 | 
| mark | 456 | 
| dave | 789 | 
| dave | 087 | 

El resultado Busco sería una tabla HTML con este aspecto:

| name | name count | 
---------------------------- 
| mark |  2  | 
| dave |  2  | 

Lo que actualmente me estoy haciendo es:

| name | name count | 
---------------------------- 
| mark |  3  | 
| dave |  2  | 

(cuenta marca 3 veces, aunque dos veces son con la misma ip).

+0

También probé IP exclusiva, SELECT (SELECCIONAR nombre, COUNT (nombre), tiempo, precio, ip, SUM (precio) DE nombredetabla donde el tiempo> = $ ayer y hora <$ hoy GROUP BY name) como TABLA Pero obtengo un error de sintaxis ... –

+0

** Try: ** SELECT DISTINCT ** TABLE.ip ** FROM (SELECT T.name, COUNT (T.name), T.time , T.price, T.ip, SUM (T.price) FROM nombredetabla T DONDE hora> = $ ayer Y hora <$ hoy nombre GROUP BY) como TABLA – lexu

+0

- "argumento suministrado no es un recurso de resultado MySQL válido" :( –

Respuesta

48

puede utilizar COUNT(DISTINCT ip), esto sólo contará valores distintos

+0

sí, pero no resuelve mi problema :) gracias –

+0

Adam: ¿Por qué esto no resuelve tu problema? –

+0

Oh espera, espera un minuto. Intentar reproducir la consulta para responder la pregunta de Marks revela: ¡ESTO FUNCIONA! No puedo creerlo Creo que podría llorar. –

3

Puede agregar el DISTINCT(ip), pero tiene que venir al inicio de la consulta. Asegúrese de escapar las variables PHP que entran en la cadena SQL.

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum 
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name 
+0

Intentó agregar DISTINCT (ip) al principio, no funcionó, simplemente lo ignora. ¿De dónde vino el 'nombreCnt'? ¿Estoy escribiendo la pregunta mal? (Funcionó conmigo sin/nameCnt y priceSum antes, excepto por lo DISTINTO) .... –

+0

Es mejor alias las columnas para que pueda consultarlas por el alias en PHP en lugar de tener que usar $ result ['COUNT (nombre)'] - en cambio con alias $ result ['nameCnt']. Creo que tendrás que 'GROUP BY ip, name', respuesta actualizada – Andy

+1

No puedes hacer eso realmente - distinct no es una función; es una palabra clave que se aplica a toda la fila, o un modificador en una función agregada. En su caso, es una palabra clave para SELECT, por lo que debe aparecer antes de los nombres de las columnas. Los paréntesis que pones alrededor de 'ip' son simplemente decorativos. –

2

De alguna manera su requerimiento suena un poco contradictorio ..

grupo por su nombre (que es básicamente una diferencia en el nombre más disposición a agregar) y luego una distinta sobre IP

¿Qué le parece debería ocurrir si dos personas (nombres) trabajaron desde la misma IP dentro del período de tiempo especificado?


¿Has probado esto?

SELECT name, COUNT(name), time, price, ip, SUM(price) 
    FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY name,ip 
+0

Lo probé, no obtuve el resultado correcto. La razón por la que quiero usar DISTINCT en ip, es que no quiero duplicar las direcciones IP. La razón por la que quiero usar GROUP BY en el nombre es para poder contar los nombres (por ejemplo, mostrar una fila de la tabla que me dice cuántas personas tienen el nombre "mark"). No tengo (y no tendré) dos nombres en la misma IP en mi db. –

+0

Con respecto al nombre GROUP BY, ip ... No resolvió el problema, creo que solo agrupa por la primera columna e ignora la segunda. –

+0

@Adam: Agrupa por nombre e IP ... puede ver esto más fácilmente moviendo la IP a la segunda posición de la lista de selección. – lexu

13

Sustitución FROM tablename con FROM (SELECT DISTINCT * FROM tablename) debe dar el resultado deseado (ignorando filas duplicadas), por ejemplo:

SELECT name, COUNT(*) 
FROM (SELECT DISTINCT * FROM Table1) AS T1 
GROUP BY name 

Resultado para sus datos de prueba:

dave 2 
mark 2 
+0

Suena bien. ¿Cómo extraigo los datos?(Nunca usó SELECT dentro de SELECT antes). ¿Table1 es mi mesa? ¿Qué es T1? Gracias de antemano –

+1

@Adam: Sí, 'Table1' es el nombre de su tabla, mientras que' T1' es el alias de esa subconsulta, por lo que también puede escribir 'SELECT T1.name, ...'. MySQL requiere alias para todas las sub-consultas (+1 para esta respuesta). –

+0

Gracias Peter y Mark. ¿Cómo uso los datos en mi php? Usé $ data = mysql_query ("SELECT ...") y luego while ($ row = mysql_fetch_array ($ data)) {echo $ row ['name']; echo $ row ['COUNT (nombre)']; } Pero ahora vuelve vacío. –

2

Pruebe lo siguiente:

SELECT DISTINCT(ip), name, COUNT(name) nameCnt, 
time, price, SUM(price) priceSum 
FROM tablename 
WHERE time >= $yesterday AND time <$today 
GROUP BY ip, name 
+0

¿Se permiten funciones agregadas con funciones DISTINCT? –