Necesito ayuda para crear una consulta SQL

Tengo pues dos tablas:

 CREATE TABLE `workers` (
  `id` int(7) NOT NULL AUTO_INCREMENT,
  `number` int(7) NOT NULL,
  `percent` int(3) NOT NULL,
  `order` int(7) NOT NULL,
      PRIMARY KEY (`id`)
 );
 CREATE `data` (
  `id` bigint(15) NOT NULL AUTO_INCREMENT,
  `workerId` int(7) NOT NULL,
  PRIMARY KEY (`id`)
 );

Quiero devolver el primer trabajador (pedido por order ASC) que su número de filas en la tabla data veces percent(de la mesa workers) /100 es menor que number(de la mesa workers.

He probado esta consulta:

SELECT workers.id, COUNT(data.id) AS `countOfData`
FROM `workers` as workers, `data` as data
WHERE data.workerId = workers.id
   AND workers.percent * `countOfData` < workers.number
LIMIT 1

Pero me sale el error:

#1054 - Unknown column 'countOfData' in 'where clause'

preguntado el 12 de junio de 12 a las 22:06

Erm, si esto no es mysql, etiquételo con los rdbms apropiados. -

No deberías tener order como nombre de columna, ya que es una palabra clave en la mayoría de los SQL. -

es mysql.... Juniad - ignora el nombre - llamémoslo sortOrder - -

@Nir La próxima vez etiquételo mysql entonces. -

¿Qué has intentado hasta ahora? Si ha intentado la consulta usted mismo, siempre es bueno mostrar sus pensamientos/esfuerzos actuales. Es más probable que las personas te ayuden si pueden ver que te has esforzado y lo has intentado. -

2 Respuestas

Esto debería funcionar:

SELECT A.id
FROM workers A
LEFT JOIN (SELECT workerId, COUNT(*) AS Quant
            FROM data
            GROUP BY workerId) B
ON A.id = B.workerId
WHERE (COALESCE(Quant,0) * `percent`)/100 < `number`
ORDER BY `order`
LIMIT 1

Respondido el 12 de junio de 12 a las 22:06

Gracias, funciona bien... pero si el trabajador en order 1 no tengo registros sobre el data table, la consulta debería devolverlo. Pero devolvió un resultado vacío: Nir

@Nir: actualicé mi respuesta para tener en cuenta su problema. También eliminé el DESC al ORDER cláusula - Lamak

Por cierto, tuve un pequeño error... Quería que fuera WHERE COALESCE(Quant,0) * number <(percent)/100 - Nir

Podría calcular el número de filas por trabajador en una subconsulta. La subconsulta se puede unir a la tabla de trabajadores. Si usas un left join, se considerará un trabajador sin filas de datos:

select  *
from    workers w
left join    
        (
        select  workerId
        ,       count(*) as cnt
        from    data
        group by
                workerId
        ) d
on      w.id = d.workerId
where   coalesce(d.cnt, 0) * w.percent / 100 < w.number
order by
        w.order
limit   1

Respondido el 12 de junio de 12 a las 22:06

Gracias, funciona bien... pero si el trabajador en order No tengo registros en la tabla de datos, la consulta debería devolverlo. Pero devolvió un resultado vacío: Nir

Se actualizó la respuesta para que devuelva un trabajador sin registros en la tabla de datos: Andomar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.