Come combinare AND e OR nella clausola WHERE utilizzando un oggetto query?


21

Dato l'SQL desiderato di seguito, dove Cond1 e Cond2 devono essere soddisfatti OPPURE Cond3 deve essere soddisfatto per la selezione, qual è il modo corretto di utilizzare getQuery()per raggiungerlo?

SQL desiderato: Condizione1 e Condizione2 tra parentesi)

SELECT * FROM #__myTable 
WHERE (condition1=true AND condition2=true) OR condition3=true

Con Concatenamento: specificando OR nel -> dove ()

$query = $db->getQuery(true);
$query->select('* FROM #__myTable')
->where('condition1 = true AND condition2 = true','OR')
->where('condition3 = true');

SQL risultante: (tra parentesi mancanti)

SELECT * FROM scm_myTable
WHERE condition1 = true AND condition2 = true OR condition3 = true

Con le matrici che specificano OR in -> dove ()

$query = $db->getQuery(true);
$conditions12 = array(
    'condition1 = true',
    'condition2 = true'
);
$conditions3 = array(
    'condition3 = true'
);
$query->select('* FROM #__myTable')
->where($conditions12, 'OR')
->where($conditions3);

SQL risultante: (tra parentesi mancanti)

SELECT * FROM scm_myTable
WHERE condition1 = true OR condition2 = true OR condition3 = true

Risposte:


20

Incluse le parentesi che sono necessarie, con Chaining, ha prodotto l'SQL desiderato:

Con concatenamento: specificando OR e avvolgendo Cond1 / 2 tra parentesi

$query = $db->getQuery(true);
$query->select('* FROM #__myTable')
->where('(condition1 = true AND condition2 = true)','OR')
->where('condition3 = true');

SQL risultante: (include parentesi)

SELECT * FROM scm_myTable
WHERE (condition1 = true AND condition2 = true) OR condition3 = true

OPPURE utilizzare oWhere / andWhere

$query = $db->getQyery(true);
$query->select('*')
->from($db->quoteName('#__myTable'))
->where($db-quoteName('condition3') . ' = TRUE')
->orWhere(array($db->quoteName('condition1') . ' = TRUE', $db->quoteName('condition2') . ' = TRUE'));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.