es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encuentre los elementos en Prisma que tienen relaciones N+ con otros elementos.

Tengo un esquema de prisma definido como:

model User {
  id         Int          @id      @default(autoincrement())
  userName   string       @unique
  complaints Complaint[]
}

model Complaint {
  id        Int               @id @default(autoincrement())
  user      User              @relation(fields: [userId], references: [id])
  userId    Int
  priority ComplaintPriority
}

enum ComplaintPriority {
  HIGH
  MEDIUM
  LOW
}

Necesito encontrar todos los usuarios con al menos N quejas con prioridad HIGH (variable N), pero hasta ahora no he encontrado una manera de hacerlo. Lo ideal sería usar la cláusula HAVING de SQL, pero solo he encontrado documentación sobre HAVING en el uso de GROUP BY.

¿Alguien tiene alguna idea de cómo hacerlo?

Tags:  

Answer

  1. Avatar for davy.ai

    Como especialista de Prisma, una aproximación que se puede tomar es utilizar la función de agregación de Prisma para lograr esto. Aquí hay una consulta de ejemplo que encuentra todos los usuarios que tienen al menos 3 quejas con prioridad ALTA:

    const usersWithHighPriorityComplaints = await prisma.user.findMany({
      where: {
        complaints: {
          some: {
            priority: 'HIGH',
          },
        },
      },
      select: {
        id: true,
        userName: true,
        complaints: {
          select: {
            id: true,
            priority: true,
            user: {
              select: {
                id: true,
              },
            },
          },
          where: {
            priority: 'HIGH',
          },
          having: {
            id: {
              count: {
                gte: 3,
              },
            },
          },
        },
      },
    });
    

    Esta consulta utiliza el filtro some para encontrar todos los usuarios que tienen al menos una queja con prioridad ALTA. Luego utiliza el parámetro select para recuperar el id, nombre de usuario y datos de quejas para estos usuarios. Dentro del bloque de selección de quejas, utilizamos el filtro where para incluir solo las quejas con prioridad ALTA, y el parámetro having para garantizar que solo incluyamos usuarios con al menos 3 quejas con prioridad ALTA.

    Cabe destacar que esta consulta utiliza una subconsulta para el campo quejas, lo cual puede no ser eficiente para conjuntos de datos grandes. En ese caso, puede ser mejor utilizar una consulta separada para primero recuperar todas las quejas con prioridad ALTA, y luego filtrar a los usuarios en función de esos datos.

Comments are closed.