내가 가진 친구 누구의 테이블을 가지고, 간단하게 다음과 같은있다 : 고유하지 않은 인덱스테이블에 친구 쌍이있는 경우, 사용자의 친구 목록을 가져 오는보기를 만드는 방법은 무엇입니까?
user_id1 | user_id2 | <some other data>
: index_on_user1
및 index_on_user2
은 모두 열 데이터의 동일한 유형을 포함, 항상 우정 양방향으로 간다.
1 | 2
= 사용자 1
2
사용자와 친구이며, 사용자는 사용자 2
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
성명서를 사용하지 않고도 친구의 ID를 항상 얻을 수있는 간단한 선택이 필요했습니다.
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...
에는 색인을 사용하지 않으며 힌트가 포함되어 있지 않습니다.
어떻게 이러한 인덱스를 사용할 수 있습니까? 심지어 가능할까요? 다른 해결책이 있습니까?
저장 프로 시저가 ID를 쿼리로 대체 할 수 있으므로 저장 프로 시저가 더 잘 작동 할 수 있습니다. – Barmar