Estoy usando MySQL. Tengo 2 mesas a las que me voy a unir. Necesito usar count (a.parent_id) como countcolumn para que esta columna se agregue a la tabla que creo con mi selección. Quiero saber el número que aparece cada "parent_id" pero ver todas las tablas con la columna de acuerdo con la consulta a continuación. El problema es que devuelve solo 1 registro y cuenta todos los padres como si fueran los mismos.

select count(parent_id) as count_column
     , a.parent_id
     , b.job_id
     , a.status as parent
     , b.status as subparent
     , b.description 
from jobs a 
inner join jobs_steps b 
  on  a.id=b.job_id 
where name='XXX' 
  and a.status='FAILED' 
order by a.parent_id desc

Si elimino la identificación del padre del recuento al principio, devuelve 78 registros

select a.parent_id
     , b.job_id
     , a.status as parent
     , b.status as subparent
     , b.description 
from jobs a 
inner join jobs_steps b 
  on  a.id=b.job_id 
where name='XXX'
  and a.status='FAILED' 
order by a.parent_id desc

Quiero tener 78 registros con una nueva columna escrita el número en el que aparece cada parent_id.

0
OhadS 16 ene. 2017 a las 22:30
Aunque mySQL no lo requiere (debido a (grupo extendido por la cláusula) cuando se utilizan funciones agregadas como count, max, avg, min, todas las columnas que no forman parte de la agregación deben incluirse en una cláusula group by. De lo contrario, el motor puede seleccionar un valor único de las columnas no agregadas y devolver su valor. Esto estaría bien si todos los valores son los MISMOS, pero si los valores varían, entonces definir el grupo por probablemente generaría resultados más cercanos a los deseados. Esto explica por qué solo obtiene 1 registro.
 – 
xQbert
16 ene. 2017 a las 22:44
Creo que quieres GROUP BY a.parent_id , b.job_id , a.status as parent , b.status as subparent , b.description no solo un.parent_ID
 – 
xQbert
16 ene. 2017 a las 22:47

2 respuestas

Si desea agrupar su resultado por identificación de padre, debe usar GROUP BY, pero esto no le devolverá 78 registros, ya que esos registros no son grupos por identificación de padre, esto le devolverá un registro por identificación de padre . espero que esto ayude

select count(a.parent_id) as count_column
     , a.parent_id
     , b.job_id
     , a.status as parent
     , b.status as subparent 
     , b.description 
from jobs a 
inner join jobs_steps b 
  on  a.id=b.job_id 
where name='XXX'
  and a.status='FAILED'
group by a.parent_id 
order by a.parent_id desc 
1
Roljhon 16 ene. 2017 a las 22:43
1
Group by debe ir antes que order by en SQL.
 – 
xQbert
16 ene. 2017 a las 22:41
¿Group concat va a funcionar sin usar group by?
 – 
Roljhon
16 ene. 2017 a las 22:53
1
El problema es obtener el recuento de muchos en la relación 1: M y mostrar todos los muchos valores. Normalmente, esto se haría usando una función de ventana, sin embargo, dado que mySQL no los admite. Por lo tanto, se requiere una segunda unión a una vista en línea que tiene los recuentos, o el recuento debe derivarse para cada fila; lo que a mí me parece más lento: por supuesto, esto supone que entiendo la pregunta, y no estoy seguro de haberlo hecho todavía.
 – 
xQbert
16 ene. 2017 a las 23:06

Suponiendo que busca la cantidad de pasos en cada trabajo (como un valor repetido para cada uno de los detalles del trabajo)

Normalmente, usaría una función de ventana, pero como mySQL no las admite, use una consulta para contar el número de parent_ID para cada trabajo y luego vuelva a unirse ...

select C.JobSteps as count_column
     , a.parent_id
     , b.job_id
     , a.status as parent
     , b.status as subparent
     , b.description 
from jobs a 
inner join jobs_steps b 
  on  a.id=b.job_id
LEFT JOIN (Select count(parent_ID) as JobSteps, job_ID 
            from Job_Steps
            Group by Job_ID) C
 on c.Job_ID = B.Job_ID
where name='XXX' 
  and a.status='FAILED' 
order by a.parent_id desc

Esto me parece más rápido que la alternativa que usa una consulta correlacionada en la selección.

select a.parent_id
     , b.job_id
     , a.status as parent
     , b.status as subparent
     , b.description 
     , (Select count(JS.parent_ID) as JobSteps, JS.job_ID 
            from Job_Steps JS
            where a.Id = JS.Job_ID
            Group by Job_ID) C as count_column
from jobs a 
inner join jobs_steps b 
  on  a.id=b.job_id
where name='XXX' 
  and a.status='FAILED' 
order by a.parent_id desc
0
xQbert 16 ene. 2017 a las 23:04