code

코드 점화기에서 mysql AND OR 쿼리 결합

starcafe 2023. 10. 30. 21:10
반응형

코드 점화기에서 mysql AND OR 쿼리 결합

CI에서 AND 또는 mysql 쿼리를 결합하고 싶습니다.저는 이미 이 스레드를 보았습니다: http://codeigniter.com/forums/viewthread/92818/ .하지만 그들은 거기서 정확한 해결책을 제시하지 않습니다.

CI 프레임워크를 엄격하게 사용하여 다음 쿼리를 생성하려면 어떻게 해야 합니까?(대괄호 없이도 쉽게 쿼리를 만들 수 있지만 동일한 쿼리가 아닙니다.)

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

추신: 이건 말이 안 된다고 해도 샘플 쿼리일 뿐입니다. 쿼리의 전체 OR 부분을 하나의 쿼리 안에 쓰는 것을 제안하지 마십시오.where().

EDIT: 기본적으로 다음과 같은 간단한 쿼리를 구현하고자 합니다.

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

CodeIgniter 3에는 이러한 목적을 위해 정확히 기능하는 새로운 메서드 group_start()group_end()가 있습니다.

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();

이게 먹힐까요?

$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();

code igniter 3.0 framework를 사용하여 별도 또는 장소 및 장소 조작을 위한 새로운 기능이 있습니다.즉, 그룹별 및 그룹단

암호처럼...

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

간단하게 사용하실 수 있습니다.

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

사용할 수도 있습니다.

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

코드 점화기에서는 이와 같이 쉽게 이해할 수 있습니다.

$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();

사용해보기Query grouping

링크 포 잇

http://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping

현재 CI2에서는 데이터베이스 클래스를 확장하고 메서드의 액세스 유형을 비공개에서 공개/보호로 변경하지 않으면 데이터베이스 클래스의 쿼리 작성기 메서드($this->db->_compile_select())에 액세스할 수 없습니다. 그러면 ActiveRecord 클래스를 사용하여 빌드하려는 것과 같은 Subquery를 빌드할 수 없습니다.당신이 구축하려는 서브쿼리와 같은 서브쿼리를 만드는 유일한 방법은 db 쿼리 방법을 사용하는 것뿐입니다.

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

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

CI Subquery에서 이 작업을 수행하는 것에 대한 블로그 게시물이 있었지만 그것은 구식이고 CI 1.7 Hope에서만 작동합니다. 약간의 도움이 됩니다.

CodeIgniter 2를 위해 이것이 필요했지만 여전히 값이 빠져나가야 했기 때문에 csotelo의 답이 나에게 좋지 않았고 Shawn C의 답처럼 전체 쿼리를 다시 쓰고 싶지 않아서 결국 이렇게 되었습니다.

$this->db->where('LastName', $lastName);
$this->db->where('Age', $age, false);
$this->db->where('1 AND ( 0', null, false); // This one starts the group
  $this->db->or_where('FirstName', $firstName1);
  $this->db->or_where('FirstName', $firstName2);
  $this->db->or_where('Gender', $gender);
  $this->db->or_where('Country', $country);
$this->db->or_where('0 )', null, false); // This one ends the group
$query = $this->db->get('Persons');

그러면 다음과 같은 쿼리가 생성됩니다.

SELECT *
FROM (`Persons`)
WHERE `LastName` =  'Svendson'
AND Age = 12
AND 1 AND ( 0 -- This one starts the group
OR `FirstName` =  'Tove'
OR `FirstName` =  'Ola'
OR `Gender` =  'M'
OR `Country` =  'India'
OR 0 ) -- This one ends the group

이것과 같은 것은 다음과 같습니다.

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

쿼리 자체가 말이 안 돼요. 선택한 항목은 다음과 같습니다.

  • 토브 스벤슨, 12살
  • 올라 스벤센(Ola
  • 스벤드슨이라는 남자는 12살이고
  • 스벤슨이라는 이름의 인도 출신자는 누구나 12살입니다.

토브는 남자 이름 같아서 굳이 성별을 선택할 필요가 없습니다.올라는 여자 이름 같아서 성별을 정하는 것이 불필요할 뿐만 아니라 말도 안 됩니다.당신의 질문은 스벤슨이라는 이름의 12살 남자와 스벤슨이라는 이름의 12살 인도 남자, 그리고 토브와 올라 스벤슨이 12살이라면 돌려줄 것입니다.

대괄호 사이에 끼우고 싶지 않은 이유가 무엇입니까?어떤 이유에서인지 현역 기록으로 해내고 싶으십니까?

언급URL : https://stackoverflow.com/questions/11056303/combining-mysql-and-or-queries-in-codeigniter

반응형