2012-06-15 9 views
25

Ich möchte AND OR MySQL Abfragen in CI kombinieren. Ich habe diesen Thread bereits gesehen: http://codeigniter.com/forums/viewthread/92818/. Aber sie bieten dort nicht die exakte Lösung.Kombinieren von MySQL und OR-Abfragen in Codeigniter

Wie erstelle ich die folgende Abfrage ausschließlich mit dem CI-Framework? (ich kann die Abfrage einfach zu erstellen, ohne dass die Klammern aber dann ist es nicht die gleiche Abfrage.)

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

PS: Dies ist nur eine Beispielabfrage, auch wenn es & keinen Sinn macht, schlägt nicht die gesamte Schreiben oder Teil der Abfrage in einem einzigen where().

EDIT: Grundsätzlich möchte ich die Umsetzung der folgenden einfachen Abfrage:

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

Antwort

35

und das wird funktionieren?

$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

ja das wird funktionieren & das ist es was ich gerade benutze. Aber das ist nicht streng CI-Art, ich muss Strings manuell entkommen. Ich vermutete auch diese Art von Antwort, die ich in der Frage erwähnt habe: "Schlage nicht vor, den gesamten OR-Teil der Abfrage in einem einzigen where() zu schreiben." – gopi1410

+3

Ich fragte dich in meiner ersten Antwort, ob du einen Grund dafür hättest active record, seit Definition einer Abfrage in() IS 'streng codeigniter', ist es gerade nicht aktiv record. In CI ist dies jedoch nicht möglich, da Sie keine geschachtelten Abfragen in AR ausführen können. Es gibt einen Abfragezeichenfolgen-Generator namens IgnitedQuery: http://www.assembla.com/wiki/show/IgnitedRecord/IgnitedQuery. –

+0

Das funktioniert nicht für mich. Die 2. Stelle, wo die Bedingung die 1. Bedingung überschreibt. CodeIgniter V 2.1.4 – TARKUS

-2

Die Abfrage selbst nicht sinnvoll ist, die Sie auswählen:

  • Tove Svendson, Alter 12
  • Ola Svendsen, Alter 12
  • Jeder Mann namens Svendson, Alter 12
  • jede Person aus Indien namens Svendson, Alter 12

Tove scheint, wie der Name eines Mannes, die Auswahl so das Geschlecht nicht notwendig ist. Ola scheint wie der Name eines Mädchens zu sein, also ist die Auswahl des Geschlechts nicht nur unnötig, es macht auch keinen Sinn. Ihre Anfrage wird jeden 12 Jahre alten Mann namens Svendson, alle 12 Jahre alten aus Indien namens Svenson, und Tove und Ola Svendson zurückgeben, wenn sie 12 Jahre alt sind.

Warum möchten Sie es nicht zwischen() Klammern setzen? Willst du es aus irgendeinem Grund mit aktiver Aufzeichnung erreichen?

+0

Die Abfrage ist nur ein Test. Ich schrieb zufällig, was mir in den Sinn kam. Grundsätzlich brauche ich f1 = v1 UND (f2 = v2 ODER f3 = v3) Art von Abfragen – gopi1410

+0

& auch meine Frage war nichts über die Auswahl, so dass Sie nicht meine Abfrage analysieren müssen – gopi1410

+0

auch meine Frage bearbeitet .. hoffe, Sie werden es bekommen dies Zeit! – gopi1410

1

Zeit mit CI2 können Sie die Methode Query Builder zugreifen ($ this-> db -> _ compile_select()) der Datenbank-Klasse, ohne die Datenbank-Klasse zu erweitern und die Methode der Zugriffstyp von privaten zu öffentlichen Wechsel/protected, das bringt die Fähigkeit zum Erstellen von Unterabfragen um, so wie Sie es mit der ActiveRecord-Klasse erstellen möchten. Die einzige Methode, eine Unterabfrage wie das zu machen Ihr wäre zu bauen versuchen nur die DB-Abfragemethode diese

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

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

Es gab einen Blog-Post zu verwenden, bei CI Subquerys zu tun, aber es ist veraltet und funktioniert nur auf CI 1.7 Hoffe das hilft ein bisschen.

34

In CodeIgniter 3 gibt es neue Methoden group_start() and group_end(), die genau für diesen Zweck dienen.

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

Wann wurde diese Version veröffentlicht?> –

+0

Dies ist der Weg, es jetzt zu tun. +1 –

+0

korrigieren Sie mich, wenn ich bitte falsch liege. muss es einen Semikolon in Ihrer Aussage außer der letzten haben? Entschuldigung, neu zu CI, –

2

In Codeigniter können wir so verwenden es einfach zu verstehen.

$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

, es scheint einfacher als eingebaute Funktionen – snAtchnAren

4

Sie diese einfach nutzen können

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

können Sie auch

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