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 には、結合テーブル Person_Func を使用した Func との 1 対多の関係 (1 人の Person - 複数の Func) が含まれています。いくつかの Funcs を持っている Person を照会したい - 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

しかし、それは良い考えではないと思いますよね?

4

1 に答える 1

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 コードがあります

于 2013-01-04T13:23:56.457 に答える