2013-01-04 111 views
0

学说查询子我已经下表:一个一对多的关系

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类包含一个一对多的关系Func键(一个人 - 几个funcs中)使用连接表Person_Func。我想查询Person,他有很多Funcs - steve(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 

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

+0

任何运气找到了这样做的最佳做法? –

回答

1

链接Person和Person_Func与JOIN是做的更清洁的方式:

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