SQL Проверка наличия пользовательских отношений - PullRequest
1 голос
/ 25 января 2011

У меня настроена таблица отношений с пользователем, которая выглядит следующим образом.

user_relationship

  • Relations_id
  • requestting_user_id
  • required_user_id
  • тип_отношения
  • отношение_статуса

Теперь скажите, что я хочу проверить отношение, чтобы увидеть, существует ли оно между двумя пользователями, которые, скажем, для этого примера являются идентификаторами 1 и 2. Я мог бысделать:

SELECT * 
  FROM user_relationship 
 WHERE (requesting_user_id='1' AND  requested_user_id='2') 
    || (requesting_user_id='2' AND  requested_user_id='1')

Но мне интересно, есть ли лучший способ сделать это быстрее?

Ответы [ 2 ]

3 голосов
/ 25 января 2011

ИЛИ, как известно, плохие исполнители.Вместо этого вы можете попробовать UNION:

SELECT a.* 
  FROM USER_RELATIONSHIP a
 WHERE a.requesting_user_id = '1' 
   AND a.requested_user_id = '2'
UNION
SELECT b.* 
  FROM USER_RELATIONSHIP b
 WHERE b.requesting_user_id = '2' 
   AND b.requested_user_id = '1'

UNION удалит дубликаты;UNION ALL не будет (и быстрее для него).

Если есть какие-либо столбцы, которые вы не используете, их не должно быть в запросе.

Индексированиедолжно быть включено:

  • requestting_user_id
  • required_user_id

... либо по отдельности, либо по одному составному индексу, но вам придется проверить, какойработает лучше всего.

0 голосов
/ 25 января 2011

Если вы предполагаете, что пользователь не может отправить запрос себе, это должно быть эквивалентно:

SELECT *
FROM user_relationship
WHERE requesting_user_id IN(1, 2) AND requested_user_id IN(1, 2);

Я сомневаюсь, что на самом деле это будет быстрее, но по крайней мере легче читать (по моему мнению).

Убедитесь, что у вас есть один индекс, который охватывает и requestting_user_id, и required_user_id - если вы часто делаете этот запрос, такой индекс определенно является обязательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...