1

私は誰が誰と友達であるかの表を持っています。それは次のように簡単です:

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...、ヒントを含めても、インデックスを使用しないと言います。

これらのインデックスを使用するにはどうすればよいですか? それは可能ですか?他の解決策はありますか?

4

2 に答える 2