【问题标题】:Doctrine query subset of one-to-many relation一对多关系的教义查询子集
【发布时间】:2013-01-04 21:23:56
【问题描述】:

我有以下表格:

mysql> show columns from Person;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
|guid | varchar(255) | NO   | PRI | NULL    |       |
+------------+--------------+------+-----+---------+-------+
mysql> show columns from Person_Func;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| Person_id | varchar(255) | NO   | PRI | NULL    |       |
| Func_id   | varchar(255) | NO   | PRI | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
mysql> show columns from Func;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| entry       | varchar(255) | NO   |     | NULL    |       |
| description | varchar(255) | NO   |     | NULL    |       |
| Guid    | varchar(255) | NO   | PRI | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

Symfony 类 Person 包含使用连接表 Person_Func 与 Func 的一对多关系(一个人 - 几个 Func)。我想查询拥有多个 Funcs 的 Person - 史蒂夫(a,b,c);约翰 (a, b, d); ele (b, d) - 我查询 (a, b) 函数,应该返回 steve 和 john。

现在我只是遍历所有人员并查询函数 - 这非常非常慢。你能帮帮我吗?

UPD 我已经成功了

SELECT DISTINCT d1.guid from (select p.guid, f.entry from Person p, Person_Func jt, Func f where p.Guid = jt.person_id and jt.func_id = f.guid and f.entry in ('A', 'B')) as d1,
(select p.guid, f.entry from Person p, Person_Func jt, Func f where p.Guid = jt.person_id and jt.func_id = f.guid and f.entry in ('A', 'B')) as d2 
where d1.guid=d2.guid and d1.entry != d2.entry

但我认为这不是一个好主意,是吗?

【问题讨论】:

  • 运气好能找到最佳实践吗?

标签: sql doctrine one-to-many dql


【解决方案1】:

使用JOIN 链接 Person 和 Person_Func 是一种更简洁的方式:

SELECT p.id
FROM Person p INNER JOIN Person_Func pf ON p.id = pf.person_id
              INNER JOIN Person_Func pf2 ON p.id = pf2.person_id
WHERE
    pf.func_id = 'a' 
    AND pf2.func_id = 'b'

这里有SQLFiddle code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多