mysql - registros - ¿Cómo comparar dos campos/columnas en una condición?
comparar dos tablas mysql php (1)
Me está costando trabajo intentar descubrir cómo hacer funcionar una sub consulta.
Imagina que tengo:
$schools
->select($this->Schools)
->select([
''pupilcount'' => $this->Pupils
->find()
->select([
$this->Pupils->find()->func()->count(''*'')
])
->where([
''Pupils.school_id'' => ''Schools.id'',
]),
El problema que estoy experimentando (creo) es que Schools.id
siempre es 0, por lo que el conteo se devuelve en 0. Puedo retirar a los alumnos y se muestra a los alumnos allí.
Traté de cambiar mi código para agregar un:
->select([''SCID'' => ''Schools.id''])
y haga referencia a que en la sub consulta pero no funciona, siempre devolverá 0 para la cuenta de pupilcount
.
¿Qué estoy haciendo mal aquí?
Siempre que encuentre problemas de consulta, verifique qué consultas se están generando en realidad (por ejemplo, utilizando DebugKit ). A menos que sea un objeto de expresión, el lado derecho de una condición siempre estará vinculado como un parámetro, es decir, está comparando con un literal de cadena:
Pupils.school_id = ''Schools.id''
En general, para una correcta compatibilidad de cotización automática, los nombres de columna deben ser expresiones de identificación. Mientras que el lado izquierdo se manejará automáticamente, el lado derecho requerirá que se maneje manualmente.
En su caso específico, puede utilizar fácilmente QueryExpression::equalFields()
, que es exactamente lo que está tratando de hacer, comparando campos / columnas:
->where(function (/Cake/Database/Expression/QueryExpression $exp) {
return $exp->equalFields(''Pupils.school_id'', ''Schools.id'');
})
También es posible crear expresiones de identificador de forma manual simplemente instalándolas:
->where([
''Pupils.school_id'' => new /Cake/Database/Expression/IdentifierExpression(''Schools.id'')
])
Y, por último, también siempre se puede pasar un solo valor de cadena, que básicamente se inserta en la consulta como SQL sin formato, sin embargo, en ese caso los identificadores no estarán sujetos a las citas de identificador automático:
->where([
''Pupils.school_id = Schools.id''
])
Ver también