我正在尝试通过匹配对象标签来查找与一个对象相关的对象。我构建了一个 mysql 查询,它将通过计算匹配标签来返回最匹配的对象。
我是 Doctrine (1.2) 的新手,所以我想知道是否有人可以帮助我走上正确的轨道,修改我的架构并创建 DQL 查询?我猜最大的问题是这两个标记集在我的 schema.yml 中并不相互关联。
架构.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
最佳答案
您也可以使用子查询。像这样的事情:
$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')
关于sql - Doctrine ORM - 自连接,没有任何实际关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145940/