如何使用DQL执行关系划分?

时间:2012-10-03 16:06:26

标签: mysql symfony-1.4 doctrine-1.2 doctrine-query

当尝试使用Doctrine 1.2执行关系分割时,我收到的“重复别名”错误超过了以下查询中的DISTINCT:

SELECT 
    Data.ID  
FROM 
    Data 
INNER JOIN 
    TaggedData ON (Data.id = TaggedData.data_id) 
INNER JOIN 
    Tag ON (Tag.id = TaggedData.tag_id) 
WHERE 
    Tag.id IN ('1' , '2') 
HAVING COUNT(DISTINCT tag.iD)=2

如果我从查询中删除 DISTINCT ,它会运行但不会得到我想要的内容。是否有正确的方法让Doctrine超越这个问题?

具体代码:

    $query = $this->createQuery("p")
        ->select("p.*")
        ->innerJoin("p.Data s")
        ->innerJoin("s.Tags c")
    ;
    $query
        ->andWhereIn("c.id", $tags)
        ->addHaving("COUNT(DISTINCT c.id) = ?", count($tags))
    ;

2 个答案:

答案 0 :(得分:1)

由于您只返回一个值,只需执行原始SQL:

    $sql = <<<SQL

SELECT 
    Data.ID  
FROM 
    Data 
INNER JOIN 
    TaggedData ON (Data.id = TaggedData.data_id) 
INNER JOIN 
    Tag ON (Tag.id = TaggedData.tag_id) 
WHERE 
    Tag.id IN ('1' , '2') 
HAVING COUNT(DISTINCT tag.iD)=2

SQL;

    $conn = Doctrine_Manager::getInstance()->getConnection('connection_name');
    $id = $conn->fetchOne($sql);

答案 1 :(得分:1)

你需要一个GROUP BY子句来使用没有明显的。 所以我想如果你在GROUP BY Data.ID之前添加HAVING,那么一切都应该没问题。