Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
У меня есть две таблицы, в которых я храню загадки и ответы пользователей на них:
riddles (z_id, v_id), здесь z_id - уникальное значение, автоинкремент, а v_id - айди автора загадки, может повторяться.
answers (z_id, v_id), здесь z_id - номер загадки, v_id - айди человека, давшего ответ. в этой таблице уникальны пары (z_id, v_id), т.к. на одну загадку человек может ответить только один раз.
Требуется выдать человеку 10 загадок, на которые он еще не давал ответ. Я изначально сделал это так:
Неактивен
jam написал:
1) правильно ли я понимаю последовательность работы MySql: сначала берутся все строки из riddles, сортируются по reyt, далее для каждой строки делается запрос v_id <> '.$vid'. AND z_id NOT IN (SELECT z_id FROM answers WHERE v_id='.$vid.'), строка либо отсекается от выборки, либо остается. и после этого выбирается из результата 10 строк. Последовательность такая?
Сначала для каждой строки делается запрос v_id <> '.$vid'. AND z_id NOT IN (SELECT z_id FROM answers WHERE v_id='.$vid.'), строка либо отсекается от выборки, либо остается.
Полученный результат сортируется по reyt.
После этого выбирается из результата 10 строк.
Отсюда понятно почему без сортировки запрос работает существенно быстрее - его выполнение прекращается после 10 найденных результатов.
В MySQL неправильно работают подзапросы в конструкции in. Они выполняются для каждой строки основного запроса, даже если являются независимыми (как в данном случае). Решение переписать запрос через JOIN
Неактивен
спасибо за ответ, проверил, летает. буду разбираться с JOIN, по началу довольно трудно въехать, как его правильно использовать
т.е. насколько я понял, при использовании IN у меня внутренний подзапрос выполнялся для каждой строки внешнего, а при использовании JOIN он выполняется только один раз и его результат сравнивается с результатом внешнего запроса. Правильно?
Неактивен
Да
Неактивен
Благодарю за ответы!
Неактивен