さて、これまでに機能する可能性のある唯一のクエリはサイモンのものです...しかし、それは本当にやり過ぎです-あなたが賞金を置く必要があるほど単純なもののためのそのような複雑な厄介なクエリ(2つのユニオンを持つ2つのサブクエリ!)? :-)そして、1000人以上のユーザーがいる場合、クエリは地獄のように遅くなります-覚えておいてください、それは二次式であり、サブクエリの結合のため、ほとんどインデックスは使用されません!
デザインを再考し、友情のために2つの重複する行を許可することをお勧めします:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
これは非効率的だと思うかもしれませんが、単純化すると、クエリを単純な結合に書き直すことができます。
select f1.Person2 as common_friend
from friends as f1 join friends as f2
using (Person2)
where f1.Person1 = '$id1' and f2.Person1 = '$id2'
and f1.status = 'friend' and f2.status = 'friend'
これは地獄のように速くなります! (Person1,2のインデックスを追加することを忘れないでください。)同様の簡略化(書き直し)をアドバイスしました結合へのサブクエリ)他の非常に厄介なデータ構造であり、クエリを高速化しました 永遠から電撃へ-インスタント!
したがって、大きなオーバーヘッド(1つの友情に対して2行)として見えていた可能性があるのは、実際には大きな最適化です:-)
また、「Xのすべての友達を見つける」などのクエリがはるかに簡単になります。そして、これ以上の報奨金を使う必要はありません:-)