Какой лучший способ найти общие строки в таблице - PullRequest
1 голос
/ 08 марта 2011

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

Таблицы похожи (упрощенно):

вопросы
ID
вопрос
active -> enum ('Y', 'N')

ответы
ID
question_id
ответить

Пользователи
ID
ник

user_answers
user_id
question_id
answer_id
private -> enum ('Y', 'N')

Я могу присоединиться к таблице user_answers с самим собой, указав псевдоним, но я должен присоединиться и к другим таблицам. Частные ответы не должны приниматься во внимание, должны приниматься только активные вопросы ...

Ожидается, что сайт получит некоторую нагрузку, поэтому я боюсь, что слишком много соединений и условий. Из своего опыта я знаю, что эти сложные запросы могут блокировать таблицы и вызывать серьезные проблемы с производительностью, особенно при большой нагрузке ...

Так что было бы лучше, если учесть масштабируемость и производительность ... Был бы чем-л. как сфинкс или солнечная помощь, или какое-либо программное решение для сравнения?

Кстати, результаты будут разбиты на страницы ...

Сейчас я думаю о том, чтобы отделить детали вопроса и детали ответа и кэшировать их, поэтому запрос будет smt. как:

select ua1.answer_id as her_answer_id,
       ua2.answer_id as my_answer_id,
       ua1.question_id
  from user_answers ua1
 inner join users_answers ua2 on ua1.question_id=ua2.question_id
 where ua1.user_id=$herId
   and ua2.user_id=$myId
   and ua1.private='N'
 order by ua1.question_id desc

questions.question и answers.answer будут взяты из кэша ... В этом случае пассивные вопросы будут проблемой, но я думаю, что я попытаюсь переместить пассивные вопросы в какую-нибудь резервную базу данных, которая усложнит ситуацию ...

1 Ответ

0 голосов
/ 20 марта 2011

Я бы использовал условное выражение в запросе:

select
user_answers.question_id `QuestionId`,
max(if((user_answers.user_id = my_id), user_answers.answer_id, 0)) `MyAnswer`,
max(if((user_answers.user_id = other_id), user_answers.answer_id, 0)) `OtherAnswer`
from users_answers
where user_answers.private = 'N'
and user_answers.user_id IN(myid, orderid)
group by users_answers.question_id
having count(*) = 2
order by user_answers.question_id

Не проверял его, но вы должны понять!

Надеюсь, у вас все получится ...

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