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.

Consulta SQL con dos cláusulas “or”

Necesito tu ayuda.

Tengo un problema con una consulta SQL que no puedo hacer.

Tengo dos tablas, “pacientes” y “usuario”, en la tabla “pacientes” tengo los campos “nombre, apellido, personal_id, strikes” y en la tabla “usuario” tengo un campo llamado “estado”. Aclaro, “personal_id” es un código asignado por la empresa, diferente de la clave primaria.

En la lógica del sistema, un usuario puede estar “desactivado” por dos razones.

1.- El administrador colocó el estado del usuario en “Inactivo”
2.- El usuario tiene 3 strikes o más.

Entonces la consulta que estoy intentando hacer es la siguiente.

Dado un “valor”, devuélveme todos los usuarios que coincidan en “personal_id O apellido” Y TAMBIÉN
los usuarios están INACTIVOS (Tanto por la razón 1 como por la razón 2)

$patients = DB::table('pacientes')
    ->join('usuario', 'pacientes.User_ID', '=', 'usuario.id')
    ->where('usuario.estado', '=', 'Inactivo')
    ->orWhere('pacientes.strikes', '>=', 3)
    ->where('pacientes.apellido', 'like', '%'.$date.'%')
    ->orWhere('pacientes.personal_id', 'like', '%'.$date.'%')
    ->get();

Básicamente necesito que mi consulta cumpla con esto:

Esto…
->where(‘usuario.estado’, ‘=’, ‘Inactivo’)
->orWhere(‘pacientes.strikes’, ‘>=’, 3)

Y TAMBIÉN

->where(‘pacientes.apellido’, ‘like’, ‘%’.$date.’%’)
->orWhere(‘pacientes.personal_id’, ‘like’, ‘%’.$date.’%’)

Básicamente, primero extrae “Todos los inactivos” y luego en esa lista busca todas las coincidencias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes modificar tu consulta SQL existente encerrando las condiciones OR dentro de una cláusula where y especificando el orden de los corchetes utilizando cierres anidados. Así es como puedes modificar la consulta:

    $patients = DB::table('patients')
        ->join('users', 'patients.User_ID', '=', 'users.id')
        ->where(function($query) use ($date) {
            $query->where('users.status', '=', 'Inactive')
                  ->orWhere('patients.strikes', '>=', 3);
        })
        ->where(function($query) use ($date) {
            $query->where('patients.last_name', 'like', '%' . $date . '%')
                  ->orWhere('patients.personal_id', 'like', '%' . $date . '%');
        })
        ->get();
    

    Primero, hemos encerrado las condiciones OR para status y strikes dentro de un cierre utilizando el método where. Ahora, solo se considerarán los pacientes que coincidan con una de las dos condiciones.

    De manera similar, encerramos las condiciones OR para last_name y personal_id dentro de otro cierre, y utilizamos el método orWhere para comparar los pacientes que tengan cualquiera de los dos valores.

    Finalmente, utilizamos el método get para obtener los registros que coinciden.

    ¡Espero que esto te ayude!

Comments are closed.