我有一张谁是谁的朋友的表格,它有以下简单内容:
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
但我有更多查询,我想在其中获取此信息作为子查询,并将包含此查询的视图作为子查询。所以我一直在寻找一种方法来抽象这个,有一些简单的选择,总能得到我朋友的 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`)
使用简单SELECT friend FROM get_friend WHERE subject = $user_id
来获得结果,并且它有效。
但是explain select...
说它不使用索引,即使有提示。
我怎样才能让它使用这些索引?甚至可能吗?还有其他一些解决方案吗?