복붙노트

[SQL] CakePHP의에서 UNION 구문

SQL

CakePHP의에서 UNION 구문

누구나 CakePHP의에서 UNION 쿼리를 만들 수있는 좋은 방법을 알고? 나는 $를 사용하지 싶습니다 this-> 쿼리 ();

두 개의 테이블 T1과 함께, T2 :

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id

세 개의 테이블 T1, T2, T3 :

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
LEFT JOIN t3 ON t2.id = t3.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
RIGHT JOIN t3 ON t2.id = t3.id

해결법

  1. ==============================

    1.너무 많은 코더는 프레임 워크의 기능에 자신을 제한하려고합니다. DO NOT. 프레임 워크가 제공하는 무엇을 사용합니다. 이 기능이 없으면 당신도 다음 추구 :

    너무 많은 코더는 프레임 워크의 기능에 자신을 제한하려고합니다. DO NOT. 프레임 워크가 제공하는 무엇을 사용합니다. 이 기능이 없으면 당신도 다음 추구 :

    또는

    종종 개발자는 둥근 구멍에 스퀘어 페그를 망치 너무 많이 정말로 단지 복잡한 코드를 만드는 추가 작업 방법을하는 바람하려고합니다. 스텝 백을 가지고 당신이 시작하는 프레임 워크를 사용하는 이유를 부탁드립니다. 그것은 구조화되지 않은 언어 구조를 제공합니다. 그것은 당신의 응용 프로그램을 빌드하는 고체 재사용 가능한 기반을 제공합니다. 자신을 넣어 및 제한 상자 수 없습니다.

    업데이트 : 나는 단지 찾기 조건을 읽는 분을 데리고 답을 찾을 수 :

    $joins = array(
        array(
            'table' => 'test_twos',
            'alias' => 'TestTwo',
            'type' => 'LEFT',
            'conditions' => array(
                'TestTwo.id = TestOne.id',
            )
        ),
        array(
            'table' => 'test_threes',
            'alias' => 'TestThree',
            'type' => 'LEFT',
            'conditions' => array(
            'TestThree.id = TestOne.id',
        )
        )
    );
    
    $dbo = $this->getDataSource();
    $subQuery = $dbo->buildStatement(
        array(
            'fields' => array('*'),
            'table' => $dbo->fullTableName($this),
            'alias' => 'TestOne',
            'limit' => null,
            'offset' => null,
            'joins' => $joins,
            'conditions' => null,
            'order' => null,
            'group' => null
        ),
        $this->TestOne
    );
    $query = $subQuery;
    
    $query .= ' UNION ';
    $joins = array(
        array(
            'table' => 'test_twos',
            'alias' => 'TestTwo',
            'type' => 'LEFT',
            'conditions' => array(
                'TestTwo.id = TestOne.id',
            )
        ),
        array(
            'table' => 'test_threes',
            'alias' => 'TestThree',
            'type' => 'RIGHT',
            'conditions' => array(
            'TestThree.id = TestOne.id',
            )
        )
    );
    
    $dbo = $this->getDataSource();
    $subQuery = $dbo->buildStatement(
        array(
        'fields' => array('*'),
        'table' => $dbo->fullTableName($this),
        'alias' => 'TestOne',
        'limit' => null,
        'offset' => null,
        'joins' => $joins,
        'conditions' => null,
        'order' => null,
        'group' => null
        ),
        $this->TestOne
    );
    
    $query .= $subQuery;
    
    pr($query);
    
  2. ==============================

    2.우리가 현재 사용하는이 작업을 수행하는 간단한 방법은, 당신이 사용하는 MySQL의에서보기 또는 어떤 데이터베이스를 만드는 것입니다. 그런 다음, 대신 모델에서 테이블을 사용하여, 당신은 당신의보기를 사용합니다. http://dev.mysql.com/doc/refman/5.6/en/create-view.html : 현재 뷰 생성 구문에 대해 읽을 수 있습니다. 또한 뷰 생성에 도움을 HeidiSQL 같은 소프트웨어를 사용할 수 있습니다.

    우리가 현재 사용하는이 작업을 수행하는 간단한 방법은, 당신이 사용하는 MySQL의에서보기 또는 어떤 데이터베이스를 만드는 것입니다. 그런 다음, 대신 모델에서 테이블을 사용하여, 당신은 당신의보기를 사용합니다. http://dev.mysql.com/doc/refman/5.6/en/create-view.html : 현재 뷰 생성 구문에 대해 읽을 수 있습니다. 또한 뷰 생성에 도움을 HeidiSQL 같은 소프트웨어를 사용할 수 있습니다.

    그런 다음 모델에서 이런 일을 할 것이다 :

    class Contenu extends AppModel {
        public $useTable = 'v_contenu';
    

    이것은 당신이 아직이 정말 좋은 CakePHP의에서 찾기 () 메소드를 사용할 수 있습니다.

    당신이 적어도 버전 5.6에 MySQL을 업데이트해야합니다 전망과 함께 최상의 성능을 얻을 수 있습니다.

  3. ==============================

    3.그 중에서 선택 뷰를 사용하여

    그 중에서 선택 뷰를 사용하여

    create view my_union as
    SELECT * FROM t1
    LEFT JOIN t2 ON t1.id = t2.id
    LEFT JOIN t3 ON t2.id = t3.id
    UNION
    SELECT * FROM t1
    RIGHT JOIN t2 ON t1.id = t2.id
    LEFT JOIN t3 ON t2.id = t3.id
    UNION
    SELECT * FROM t1
    RIGHT JOIN t2 ON t1.id = t2.id
    RIGHT JOIN t3 ON t2.id = t3.id
    

    당신의 코드에서 :

    select * from my_union
    
  4. ==============================

    4.이 같은 코드를 사용 :

    이 같은 코드를 사용 :

    $friendsPosts= $this->Posts->find('all')
                    ->contain(['Users', 'Languages', 'PostStates'])
                    ->innerJoinWith('Users.Dusers', function ($q) {
                        return $q->where(['Dusers.id' => $this->Auth->user('id')]);
                    });
    
            $posts= $this->Posts->find('all')
                    ->where(['Posts.post_state_id' => 3])
                    ->contain(['Users', 'Languages', 'PostStates']);
    
        $posts->union($friendsPosts);
    
  5. from https://stackoverflow.com/questions/3536107/union-syntax-in-cakephp by cc-by-sa and MIT license