¿Cómo seleccionar visitantes únicos por intervalo de dates?

He encontrado algunas cadenas de búsqueda relacionadas con lo que estoy buscando, pero nada que haga esto. Básicamente, tengo un gráfico que necesita mostrar visitantes únicos por intervalo de time (hora, día, mes o año). Entonces, un gráfico similar a Google Analytics o este Gráfico de Analytics . La tabla tiene una columna de ID de visitante y una columna de timestamp (en el estilo 0000-00-00 00:00:00). Necesito poder seleccionar los visitantes únicos o totales por intervalo (por ejemplo, 32 visitantes el día 5, 30 el día 6, etc.).

Supongo que mi pregunta es, ¿hay alguna forma de hacerlo de manera eficiente con solo una consulta? ¿O tendré que usar PHP para get todos los datos (problema con eso es que tendría que hacer una consulta para cada punto en el gráfico, no eficiente)?

Necesitarás agregar tus datos. Prueba esta consulta:

 SELECT DATE(data_timestamp), COUNT(visitor_id) FROM analytics_table WHERE DATE(data_timestamp) BETWEEN '2011-05-01' AND '2011-05-31' GROUP BY 1 

A continuación se detalla cómo llena sus datos mensuales ( ADVERTENCIA: ¡NO PRUEBA! ):

 <?php $sql = "SELECT DATE(data_timestamp), COUNT(visitor_id) FROM analytics_table WHERE DATE(data_timestamp) BETWEEN '2011-05-01' AND '2011-05-31' GROUP BY 1"; $rs = mysql_query($rs); $date1 = $datex = '2011-05-01'; $date2 = '2011-05-31'; $arrayData = $tmpArray = array(); while( $r = mysql_fetch_array($rs) ) { $tmpArray[$r['date']] = $r['count']; } while( $datex <= $date2) { if( isset($tmpArray[$datex]) ) { $arrayData[$datex] = $tmpArray[$datex]; } else { $arrayData[$datex] = 0; } list( $y, $m, $d) = explode('-', $datex); $datex = date('Ym-d', mktime(0, 0, 0, $m, $d, $y)); } ?> 

este uso de consulta:

  • FECHA () para get la date de sus datos y
  • COUNT () para contar los datos totales de esa date en particular.
  • y GROUP BY para agrupar sus datos según el campo que select.

Básicamente, puede convertir DATETIME / TIMESTAMP en dates y horas por separado, y luego usar GROUP BY para get los resultados que necesita.

MySQL / SQL: agrupar por date solo en una columna de date y hora

GROUP BY no devuelve 0 valor si no hay visitante algún día. Eso cederá a los agujeros en la continuidad del time. Hay dos maneras:

1) Grupo como otros dijeron y luego encuentran agujeros

2) Cree una tabla de agregación con los campos "date", "conteo", etc. e inserte allí datos todos los días por cron.