【问题标题】:Doctrine ORM - Self join without any real relationDoctrine ORM - 没有任何实际关系的自加入
【发布时间】:2010-01-27 10:08:14
【问题描述】:

我试图通过匹配对象标签来找到与一个对象相关的对象。我已经构建了一个 mysql 查询,它将通过计算匹配标签来返回最匹配的对象。

我是学说 (1.2) 的新手,所以我想知道是否有人可以帮助我走上正确的轨道,修改我的架构并创建 DQL 查询?最大的问题是这两个标签集在我的 schema.yml 中彼此不相关,我猜想。

Schema.yml:

Object:
  columns:
    name:
  relations:
    Tags: { foreignAlias: Objects, class: Tag, refClass: Tagset}

Tagset:
  columns:
    object_id: {type: integer, primary: true, notnull: true}
    tag_id: { type: integer, primary: true, notnull: true }
  relations:
    Object: { foreignAlias: Tagsets }
    Tag: { foreignAlias: Tagsets }

Tag:
  columns:
    name: { type: string(255), notnull: true }
    Object: { foreignAlias: Tags, class: Object, refClass: Tagset}

这是使用上述模式的 mysql 查询:

SELECT object.name, COUNT(*) AS tag_count
FROM tagset T1
INNER JOIN tagset T2
    ON T1.tag_id = T2.tag_id AND T1.object_id != T2.object_id
INNER JOIN object
    ON T2.object_id = object.id
WHERE T1.object_id = 2
GROUP BY T2.object_id
ORDER BY COUNT(*) DESC

【问题讨论】:

    标签: sql mysql symfony1 doctrine dql


    【解决方案1】:

    您也可以使用子查询。像这样的:

    $object_id = 2;
    
    Doctrine::getTable('Tagset')->createQuery('t')
      ->select('t.tag_id, o.id, o.name, COUNT(t.tag_id) AS tag_count')
      ->innerJoin('t.Object o WITH o.id != ?', $object_id)
      ->where('t.tag_id IN (SELECT t.tag_id FROM Tagset t WHERE t.object_id = ?)', $object_id)
      ->groupBy('t.object_id')
    

    【讨论】:

      【解决方案2】:

      解决方案:

      $q = new Doctrine_RawSql();
          $this->related_objects = $q->
                  select('{o.name}')->
                  from('tagset t1 JOIN tagset t2 ON t1.tag_id = t2.tag_id AND t1.object_id != t2.object_id JOIN object o ON t2.object_id = o.id')->
                  addComponent('o','Object o')->
                  where('t1.object_id = ?', $this->object->id)->
                  groupBy('t2.object_id')->
                  orderBy('COUNT(*) DESC')->
                  execute();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        相关资源
        最近更新 更多