私は誰が誰と友達であるかの表を持っています。それは次のように簡単です:
user_id1 | user_id2 | <some other data>
一意でないインデックス:index_on_user1
およびindex_on_user2
両方の列には同じタイプのデータが含まれており、友情は常に双方向に行きます。
1 | 2
= user1
は user と友達で2
あり、 user2
は user と友達1
です。
私が望むのは、提供する user_id の友人のリストを一貫して提供するクエリを取得することです。
今まで、使ってきた
SELECT if(`user_id1` = $user_id, `user_id2`, `user_id1`) as friend
FROM `Friends`
WHERE `user_id1` = $user_id OR `user_id2` = $user_id
しかし、この情報をサブクエリとして取得し、このクエリを含むビューをサブクエリとして作成したいクエリが他にもあります。だから私はこれを抽象化する方法を探していたif
.
私はユニオンでこのアイデアを持っています:
CREATE OR REPLACE VIEW get_friend AS
SELECT
`user_id1` as subject,
`user_id2` as friend,
FROM `Friends`
USE INDEX (`index_on_user1`)
UNION
SELECT
`user_id2` as subject,
`user_id1` as friend,
FROM `Friends`
USE INDEX (`index_on_user2`)
simpleSELECT friend FROM get_friend WHERE subject = $user_id
を使用して結果を取得すると、機能します。
しかしexplain select...
、ヒントを含めても、インデックスを使用しないと言います。
これらのインデックスを使用するにはどうすればよいですか? それは可能ですか?他の解決策はありますか?