2012-06-15 9 views
25

Desidero combinare query AND OR mysql in CI. Ho già visto questa discussione: http://codeigniter.com/forums/viewthread/92818/. Ma non forniscono la soluzione esatta lì.combinazione di query mysql AND OR in Codeigniter

Come si crea la seguente query utilizzando esclusivamente il framework CI? (posso creare la query facilmente senza le parentesi, ma poi non è la stessa query.)

SELECT * FROM `Persons` WHERE 
LastName='Svendson' AND Age="12" AND 
(FirstName='Tove' OR FirstName='Ola' OR Gender="M" OR Country="India") 

PS: Questo è solo un esempio di ricerca, anche se non ha senso & Non suggerire a scrivere l'intero OR parte della query all'interno di un singolo where().

EDIT: Fondamentalmente voglio l'attuazione del seguente query semplice:

SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 

risposta

35

e funzionerà?

$this->db->where('LastName', 'Svendson'); 
$this->db->where('Age', 12); 
$this->db->where("(FirstName='Tove' OR FirstName='Ola' OR Gender='M' OR Country='India')", NULL, FALSE); 
$query = $this->db->get('Persons'); 
return $query->result(); 
+2

sì questo funzionerà e questo è quello che sto attualmente usando. Ma questo non è rigorosamente a senso unico, devo sfuggire manualmente alle stringhe. Inoltre, sospettavo questo tipo di risposta, così ho menzionato nella domanda "Non suggerire di scrivere l'intera parte OR della query all'interno di una singola dove()." – gopi1410

+3

Ti ho chiesto nella mia risposta iniziale se avessi qualche motivo per farlo con record attivo, dal momento che definire una query all'interno di() È 'strict codeigniter', non è un record attivo. Ad ogni modo, questo non è possibile all'interno della CI dato che non ti permettono di fare query annidate in AR. C'è un costruttore di stringhe di query chiamato IgnitedQuery per questo: http://www.assembla.com/wiki/show/IgnitedRecord/IgnitedQuery. –

+0

Questo non funziona per me. Il 2 ° in cui la condizione è prioritaria rispetto alla condizione 1a. CodeIgniter V 2.1.4 – TARKUS

-2

query stessa non ha senso, si sta selezionando:

  • Tove Svendson, età 12
  • Ola Svendsen, 12 anni
  • qualsiasi maschio di nome Svendson, 12 anni
  • qualsiasi persona da India chiamato Svendson, età 12

Tove sembra il nome di un uomo, quindi selezionando il genere non è necessaria. Ola sembra il nome di una ragazza, quindi selezionare il genere non è solo inutile, ma non ha senso. La tua domanda restituirà qualsiasi maschio di 12 anni di nome Svendson, qualsiasi dodicenne dell'India chiamato Svenson, e Tove e Ola Svendson, SE hanno 12 anni.

Perché non vuoi metterlo tra parentesi? Vuoi farlo con un record attivo per qualche motivo?

+0

La query è solo una prova. Ho scritto a caso quello che mi è venuto in mente. Fondamentalmente ho bisogno di f1 = v1 AND (f2 = v2 OR f3 = v3) tipo di query – gopi1410

+0

e anche la mia domanda non era nulla di selezione, quindi non è necessario analizzare la mia domanda – gopi1410

+0

anche modificato la mia domanda .. spero che lo otterrete tempo! – gopi1410

1

Attualmente con CI2 non si può accedere al metodo query ($ this-> db -> _ compile_select()) della classe Database senza estendere la classe di database e cambiare tipo di accesso del metodo dal privato al pubblico/protected, che uccide la possibilità di creare Subquery come se si provasse a creare usando la classe ActiveRecord. L'unico metodo per fare una subquery come quella tua cercando di costruire sarebbe quella di utilizzare solo il metodo di query db

$table = $this->db->dbprefix('tablename'); 

$sql = "SELECT * FROM `{$table}` WHERE field1='?' AND (field2='?' OR field3='?') "; 
$this->db->query($sql,array($field1,$field2,$field3)); 

C'era un post sul blog di fare questo a CI Subquerys ma è fuori di data e funziona solo su CI 1.7 Spero che aiuti un po '.

34

In CodeIgniter 3 ci sono nuovi metodi group_start() and group_end() che servono esattamente per questo scopo.

return $this->db 
    ->where('LastName', 'Svendson'); 
    ->where('Age', 12); 
    ->group_start() 
     ->where('FirstName','Tove') 
     ->or_where('FirstName','Ola') 
     ->or_where('Gender','M') 
     ->or_where('Country','India') 
    ->group_end() 
    ->get('Persons') 
    ->result(); 
+0

Quando è stata rilasciata questa versione?> –

+0

Questo è il modo per farlo ora. +1 –

+0

correggimi se sbaglio, per favore. ha bisogno di avere un punto e virgola nella dichiarazione, tranne per l'ultimo? scusa nuovo per CI, –

2

In Codeigniter possiamo usare in questo modo è facile da capire.

$sql = "SELECT 
      * 
     FROM 
      `Persons` 
     WHERE 
      LastName = 'Svendson' 
     AND Age = '12' 
     AND (
      FirstName = 'Tove' 
      OR FirstName = 'Ola' 
      OR Gender = 'M' 
      OR Country = 'India' 
     )"; 

$query = $this->db->query($sql); 

return $query->result(); 
+0

per me, sembra più facile rispetto alle funzioni integrate – snAtchnAren

4

È possibile utilizzare questo semplicemente

$this->db->where("status","live")->or_where("status","dead"); 

è anche possibile utilizzare

$this->db->where("(status='live' OR status='dead')"); 
Problemi correlati