sql >> Database teknologi >  >> RDS >> Mysql

Hvordan sammenligner man to felter/kolonner i en tilstand?

Når du støder på forespørgselsproblemer, skal du kontrollere, hvilke forespørgsler der rent faktisk genereres (f.eks. ved hjælp af DebugKit ). Medmindre det er et udtryksobjekt, vil højre side af en betingelse altid være bundet som en parameter, dvs. du sammenligner med en streng-literal:

Pupils.school_id = 'Schools.id'
 

Generelt skal kolonnenavne være identifikationsudtryk for at sikre korrekt autocitatkompatibilitet. Mens venstre side automatisk vil blive håndteret korrekt, skal højre side håndteres manuelt.

I dit specifikke tilfælde kunne du nemt bruge QueryExpression::equalFields() , som er ment for præcis, hvad du prøver at gøre, sammenligne felter/kolonner:

->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) { return $exp->equalFields('Pupils.school_id', 'Schools.id'); })

Det er også muligt at oprette identifikationsudtryk manuelt ved blot at instansiere dem:

->where([
    'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
 

eller fra CakePHP 3.6 via Query::identifier() metode:

->where([
    'Pupils.school_id' => $query->identifier('Schools.id')
])
 

Og endelig kan du også altid sende en enkelt strengværdi, som grundlæggende er indsat i forespørgslen som rå SQL, men i så fald vil identifikatorerne ikke være genstand for automatisk identifikationscitering:

->where([
    'Pupils.school_id = Schools.id'
])
 

Se også




  1. VB.NET MySQL-forbindelse

  2. sql grupper efter kun rækker, der er i rækkefølge

  3. SQL Server Teksttype vs. varchar datatype

  4. Valg af rækker ordnet efter en kolonne og adskilt i en anden