2012-06-15 54 views
25

Tôi muốn kết hợp các truy vấn AND OR mysql trong CI. Tôi đã xem chủ đề này: http://codeigniter.com/forums/viewthread/92818/. Nhưng chúng không cung cấp giải pháp chính xác ở đó.kết hợp các truy vấn mysql AND OR trong Codeigniter

Làm cách nào để tạo truy vấn sau bằng đúng khung CI? (tôi có thể tạo ra các truy vấn một cách dễ dàng không có dấu ngoặc nhưng sau đó nó không phải là cùng một truy vấn.)

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

PS: Đây chỉ là một truy vấn mẫu thậm chí nếu nó làm cho không có ý nghĩa & Đừng đề nghị bằng văn bản cho toàn bộ HOẶC một phần của truy vấn bên trong một đơn where().

EDIT: Về cơ bản tôi muốn thực hiện các truy vấn đơn giản sau đây:

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

Trả lời

35

và thao tác này sẽ hoạt động?

$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

có điều này sẽ hoạt động và đây là những gì tôi hiện đang sử dụng. Nhưng đây không phải là cách CI nghiêm ngặt, tôi phải thoát khỏi chuỗi bằng tay. Ngoài ra tôi nghi ngờ loại câu trả lời như vậy đã đề cập trong câu hỏi 'Không đề nghị viết toàn bộ hoặc một phần của truy vấn bên trong một nơi duy nhất().' – gopi1410

+3

Tôi hỏi bạn trong câu trả lời ban đầu của tôi nếu bạn có một số lý do để thực hiện điều này với hồ sơ hoạt động, kể từ khi xác định một truy vấn trong() IS 'nghiêm ngặt codeigniter', nó chỉ là không hoạt động ghi lại. Dù sao, điều này là không thể trong CI vì chúng sẽ không cho phép bạn thực hiện các truy vấn lồng nhau trong AR. Có một trình tạo chuỗi truy vấn được gọi là IgnitedQuery cho điều đó: http://www.assembla.com/wiki/show/IgnitedRecord/IgnitedQuery. –

+0

Điều này không hiệu quả đối với tôi. Thứ 2, nơi điều kiện được ghi đè ở vị trí thứ nhất trong điều kiện. CodeIgniter V 2.1.4 – TARKUS

-2

Truy vấn bản thân không có ý nghĩa, bạn đang chọn:

  • Tove Svendson, tuổi tác 12
  • Ola Svendsen, 12 tuổi
  • bất kỳ nam nào có tên Svendson, 12 tuổi
  • bất kỳ người nào từ Ấn Độ có tên Svendson, tuổi 12

Tove có vẻ như tên của một người đàn ông, vì vậy việc chọn giới tính là không cần thiết. Ola có vẻ giống như tên của một cô gái, vì vậy việc chọn giới tính không chỉ là không cần thiết, nhưng nó không có ý nghĩa. Truy vấn của bạn sẽ trả lại bất kỳ nam 12 tuổi tên là Svendson, bất kỳ 12 tuổi từ Ấn Độ tên là Svenson, và Tove và Ola Svendson, NẾU họ 12 tuổi.

Tại sao bạn không muốn đặt dấu ngoặc đơn()? Bạn có muốn hoàn thành nó với hồ sơ hoạt động vì một lý do nào đó không?

+0

Truy vấn chỉ là một thử nghiệm. Tôi ngẫu nhiên viết bất cứ điều gì đến tâm trí của tôi. Về cơ bản tôi cần f1 = v1 AND (f2 = v2 HOẶC f3 = v3) loại truy vấn – gopi1410

+0

và câu hỏi của tôi cũng không có gì về lựa chọn, vì vậy bạn không cần phân tích truy vấn của mình – gopi1410

+0

cũng đã chỉnh sửa câu hỏi của mình .. hy vọng bạn sẽ hiểu thời gian! – gopi1410

1

Hiện nay với CI2 bạn không thể truy cập vào các phương pháp Query Builder ($ this-> db -> _ compile_select()) của lớp cơ sở dữ liệu mà không cần mở rộng các lớp Cơ sở dữ liệu và thay đổi kiểu truy cập của phương pháp từ riêng tư thành công/được bảo vệ, sẽ giết khả năng xây dựng Subquery giống như việc bạn cố gắng xây dựng bằng cách sử dụng lớp ActiveRecord. Phương pháp duy nhất để thực hiện một subquery như một cố gắng của bạn để xây dựng sẽ chỉ sử dụng phương pháp truy vấn 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ó một bài viết trên blog về việc này tại CI Subquerys nhưng đó là lỗi thời và chỉ hoạt động trên CI 1.7 Hy vọng rằng sẽ giúp một chút.

34

Trong CodeIgniter 3 có các phương pháp mới group_start() and group_end() phục vụ chính xác cho mục đích này.

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

Khi nào phiên bản này được phát hành?> –

+0

Đây là cách để làm điều đó ngay bây giờ. +1 –

+0

sửa tôi nếu tôi sai. hiện nó cần phải có một dấu chấm phẩy trong tuyên bố của bạn ngoại trừ cái cuối cùng? xin lỗi mới đến CI, –

2

Trong Codeigniter chúng tôi có thể sử dụng như thế này dễ hiểu.

$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

với tôi, nó có vẻ dễ dàng hơn so với các chức năng trong xây dựng – snAtchnAren

4

Bạn có thể sử dụng này chỉ đơn giản

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

bạn cũng có thể sử dụng

$this->db->where("(status='live' OR status='dead')"); 
Các vấn đề liên quan