2011-12-23 9 views
7

Estoy intentando devolver los datos de las filas con la fecha más reciente de cada candidate_id distinto. Está devolviendo correctamente la fecha más reciente (la columna created_unix), pero no el resto de los datos de la fila correspondiente.Devuelve los datos de las filas con la fecha más reciente de cada candidate_id distinto

SELECT candidate_id, message, max(created_unix), jobpost_id, staffuserid 
    FROM messages 
     WHERE employer_id='$employerid' AND last='company' 
      GROUP BY candidate_id 
+2

posible duplicado de [Obtener la fila que tiene el valor Máx. Para una columna] (http://stackoverflow.com/questions/121387/), [MySQL: seleccionando todos los campos correspondientes utilizando MAX y GROUP BY] (http: //stackoverflow.com/questions/1305056/mysql-selecting-all-corresponding-fields-using-max-and-group-by) – outis

Respuesta

5

Usted group by todo lo que no debe utilizar una función agregada:

SELECT candidate_id, message, max(created_unix), jobpost_id, staffuserid 
    FROM messages 
     WHERE employer_id='$employerid' AND last='company' 
      GROUP BY candidate_id, message, jobpost_id, staffuserid 

Si su message es diferente por fila y desea group by candidate_id, entonces no se debe utilizar message. En ese caso, simplemente elimínelo de su lista de selección y no lo necesitará en su lista group by. Lo mismo aplica para cualquier otro campo que no estés usando.

Recuerde, al usar funciones de agregado, debe contener cada campo en una función de agregado o en group by. De lo contrario, SQL no sabrá de qué fila extraer los datos para la fila devuelta.

Actualización:

Después de ver lo que está buscando, esto va a hacer el truco:

SELECT candidate_id, message, max(created_unix), jobpost_id, staffuserid 
    FROM messages 
     WHERE employer_id='$employerid' AND last='company' AND 
     created_unix = (
      SELECT max(subm.created_unix) 
      FROM messages subm 
      WHERE subm.candidate_id = messages.candidate_id 
     ) 
+0

Gracias por los comentarios, Justin. Hacer esto enumerará todas las filas (cada fila tiene un mensaje único). Solo quiero una fila por candidate_id distinto que cumpla con los criterios WHERE. No es necesario agrupar por jobpost_id o staffuserid, ya que solo hay 1 por candidato_id. – arrogantprick

+0

Pero * hay * una necesidad de hacer eso. Cuando usa funciones agregadas, para cada campo que devuelve, debe usarlo en una función agregada o en el 'grupo por'. Parece que no está utilizando el campo de mensaje de todos modos, simplemente elimínelo de su declaración 'select' y no lo necesitará en su' group by'. –

+0

Estoy usando el campo de mensaje como lo estoy imprimiendo en una tabla. Todo mi problema fue que estaba imprimiendo un mensaje de la fila incorrecta (no la fila que contiene el máximo del campo created_unix). – arrogantprick

4
SELECT m1.* 
FROM messages as m1 
    LEFT OUTER JOIN messages AS m2 
    ON (m1.candidate_id = m2.candidate_id 
     AND (m1.created_unix < m2.created_unix) 
WHERE m2.created_unix is NULL 
AND employer_id='$employerid' AND last='company' 

Esto se une a sí mismo en messages candidate_id y hace filas con picos todos fechas en m2 que son mayores que cada fecha en m1, sustituyendo NULL si ninguna es mayor. Entonces obtiene NULL precisamente cuando no hay una fecha mayor dentro de ese candidate_id.

Cuestiones relacionadas