Búsqueda de sitios web

typescript - ¿Puede Knex hacer "HAVING COUNT(col) > x" sin recurrir a raw?


Quiero construir la siguiente consulta usando knex (en TypeScript), y estoy confundido por el HAVING COUNT. El sitio web de knex parece indicar que solo se puede hacer con HavingRaw, pero tengo curiosidad si hay una solución sin usar SQL en crudo.

La consulta en SQL:

SELECT UserId, COUNT(UserId)
FROM [MyTable] 
WHERE UserId IS NOT NULL 
AND OrderDate BETWEEN '2022-01-10T00:00:00.000Z' AND '2022-01-14T23:59:59.999Z'
GROUP BY UserId
HAVING COUNT(UserId) >= 5

Mi implementación actual:

    const mainQuery = knexDb('MyTable')
        .select('UserId')
        .count('UserId')
        .whereNotNull('UserId')
        .whereBetween('TargetDate', [date1, date2])
        .groupBy('UserId')
        .havingRaw('COUNT(UserId) >= ?', [5]);

Tengo curiosidad si existe una alternativa integrada y tipada para la parte .havingRaw('COUNT(UserId) >= ?', [5]);

Respuesta #1

En tu ejemplo específico podrías asignar un alias al conteo en tu selección y luego simplemente referenciar eso en la cláusula having. es decir

const mainQuery = knexDb('MyTable')
        .select('UserId')
        .count('UserId as UserCount')
        .whereNotNull('UserId')
        .whereBetween('TargetDate', [date1, date2])
        .groupBy('UserId')
        .having('UserCount', '>=', 5);

Si aún no tienes la columna que estás contando en tu select, entonces no creo que sea posible sin usar raw actualmente.