2011-02-01 8 views
2

저는 Propel에 익숙하지 않으며 문서를 읽었습니다. 하지만, 나는 EXISTS와 NOT EXISTS 구문을 SQL에서 명확하게 발견하지 못했습니다. 예를 들어 .NET의 Linq에는 Any()가 있습니다. "관용적 인"Propel에 다음과 같은 기능이 있습니까? 추진에서 쉽게 행할 수propel equivalent of "exists"

SELECT 
    a.column1, 
    a.column2, 
    a.etc 
FROM 
    TableA a 
WHERE 
    (SELECT 
    COUNT(*) 
    FROM 
    TableB b 
    WHERE 
    b.someIdColumn = a.someIdColumn 
     AND 
    b.aNullableDateColumn IS NULL 
) > 0 

:

SELECT a.column1, a column2, a.etc 
FROM TableA a 
WHERE NOT EXISTS (SELECT 1 
        FROM TableB b 
        WHERE b.someIdColumn = a.someIdColumn 
        AND b.aNullableDateColumn IS NULL) 
+0

당신이 "적절한"을 의미 않았던 사용자 그룹에없는 모든 사용자를 선택? (제목) – Trufa

+1

@Trufa 아니, Propel, ORM : http://www.propelorm.org/ – Andrew

+3

죄송합니다. 완전히 알려지지 않았습니다. 당신이 무슨 말을하고 있는지 전혀 몰라요, 왜 제가 편집하지 않았습니까! hehe는 당혹 스러울 것입니다 : P – Trufa

답변

4

좀 더 파고를 수행 한 후, 나는 현재 사용할 수있는 나는 내 질문에 대한 답변, 또는 적어도 좋은 대답을 생각합니다.

EXISTS 또는 NOT EXISTS 뒤에 오는 것은 부속 조회입니다. 그 사실은 명백한 것처럼 보이지만 원래 서브 쿼리에 대한 도움을 찾기 위해 필자가 찾지 못한 것은 아닙니다. 주제에서 fewresources을 찾았습니다. 본질적으로 옵션은 JOIN을 사용하여 쿼리를 다시 쓰거나 (@ Kaltas의 대답의 핵심) Criteria::CUSTOM을 사용하는 것입니다. 하위 쿼리를 유지하면서 데이터베이스 성능을 잠재적으로 돕기 때문에 두 번째 옵션을 선호한다고 판단했습니다.

나는 많은 책을 읽었지 만 Criteria::CUSTOM에 대해 많이 읽었지 만 Propel 1.5 소스를 읽는 데 정말 도움이되는 독서가 있습니다. 정말 간단합니다. 그냥 그대로 EXISTS와 함께 (데이터베이스의 테이블과 열 이름, 하지 추진의 객체 이름을 사용), 서브 쿼리를 넣어 또는 NOT처럼 where 호출에 존재 : 그것은 그렇게 간단입니다

TableAQuery::create() 
    ->where('NOT EXISTS (SELECT 1 FROM TableB WHERE TableA.someIdColumn = TableB.someIdColumn AND TableB.aNullableDateColumn IS NULL)') 
    ->find(); 

. 내부적으로 where 메서드는 절을 해석하는 몇 가지 가능성을 찾아서 일치하는 항목이없는 경우 해당 절을 Criteria::CUSTOM으로 처리하고 그대로 SQL 쿼리에 삽입합니다. 예를 들어 테이블 별칭을 사용할 수 없었습니다.

내가 시간이 있다면 어쩌면이 작업을 수행하고 패치를 제출하는 "ORM-ish"방식으로 작업하겠습니다. 누군가는 아마 저를 때릴 것입니다. u는 지금 Criteria::INCriteria::NOT_IN

예를 사용할 수 있습니다 펠 1.6에서와 마찬가지로

0

난 당신이 같이 쿼리를 다시 작성할 수 있다고 생각.

심지어 깨끗하고 추진에 달성하기 쉬운 :

SELECT 
    a.column1, 
    a.column2, 
    a.etc 
FROM 
    TableA a 
    LEFT JOIN 
    TableB b ON (b.someIdColumn = a.someIdColumn) 
WHERE 
    b.aNullableDateColumn IS NULL 
    AND 
    b.primaryKeyColumn IS NOT NULL 
+0

답장을 보내 주셔서 감사합니다. 나는 그것이 실행 가능할 것이라고 생각하지만, 나는이 코드를 실제로 사용하고있는 상황에서 좀 더 나은 것을 발견했다. – Andrew

+0

당신의 답을 볼 수 있습니다 - 손으로 작성한 SQL을 사용하면이 경우 가장 쉽고 빠른 방법입니다. – Jan

0

:

$users = UserQuery::create()->filterById(
             UserPerUserGroupQuery::create()->select('user_id')->find(), CRITERIA::NOT_IN 
             ) 
          ->orderByUserName() 
          ->find();